从字符串

时间:2018-04-23 12:14:42

标签: r

我在数据框中有一个向量,在记录时列出了eur,gbp和usd的价格。数据列出了一个条目中的所有三个值,例如:

X<-c( "{\"eur\": 4900, \"gbp\": 4250, \"usd\": 6120}", 
                 "{\"gbp\": 730, \"usd\": 1050}",  
                 "{\"eur\": 1050, \"gbp\": 910, \"usd\": 1310}",
                 "{\"eur\": 400, \"gbp\": 350, \"usd\": 500}" )
X
    [1] "{\"eur\": 4900, \"gbp\": 4250, \"usd\": 6120}"
    [2] "{\"gbp\": 730, \"usd\": 1050}"                
    [3] "{\"eur\": 1050, \"gbp\": 910, \"usd\": 1310}" 
    [4] "{\"eur\": 400, \"gbp\": 350, \"usd\": 500}" 

因此,一个条目看起来像{"eur": 8200, "gbp": 6740, "usd": 9600}

大多数条目都有eur,gbp和usd的值,但有些条目缺少一种货币的数据,例如{"gbp": 9700, "usd": 13650}

我认为这可能更适合作为列表,或者可能是3个单独的向量,但是当我从csv导入数据时它就作为一个字符出现了。

我想要的是从字符串中提取GBP值,因此对price: {"eur": 12100, "gbp": 10200, "usd": 14500}我会得到priceGBP: 10200

我认为我可以做一些过于复杂和愚蠢的事情,例如使用grep在字符串中找到“gbp”的位置,然后提取它后面的字符。但我想知道在给定数据结构的情况下是否有一种巧妙的方法可以做到这一点。

我可以用不同的方式导入csv吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试tidyverse方法

library(tidyverse)
str_split(X, pattern = ",") %>% 
   map(.,~grep("gbp", ., value=T)) %>%   
   map_chr(.,~str_split(.,":", simplify = T)[2] %>% str_trim) %>% 
   as.numeric()
[1] 4250  730  910  350

答案 1 :(得分:0)

如果我理解你的问题,你可以试试这个 -

library(dplyr)

df %>%
  mutate(priceGBP=ifelse(grepl("gbp", price), 
                         gsub(".*\"gbp\": (\\d+).*", "\\1", price), 
                         NA))

输出为:

                                    price priceGBP
1 {"eur": 4900, "gbp": 4250, "usd": 6120}     4250
2               {"gbp": 730, "usd": 1050}      730
3               {"eur": 1050,"usd": 1310}     <NA>
4    {"eur": 400, "gbp": 350, "usd": 500}      350

示例数据:

df <- structure(list(price = structure(c(3L, 4L, 1L, 2L), .Label = c("{\"eur\": 1050,\"usd\": 1310}", 
"{\"eur\": 400, \"gbp\": 350, \"usd\": 500}", "{\"eur\": 4900, \"gbp\": 4250, \"usd\": 6120}", 
"{\"gbp\": 730, \"usd\": 1050}"), class = "factor")), .Names = "price", row.names = c(NA, 
-4L), class = "data.frame")