如何将CSV文件上载到包含一行以[“ 123”,“ 456”,“ 789”]形式的列表的一行的R中?

时间:2019-04-04 05:04:37

标签: r csv

我正在尝试上传一个CSV文件,该文件具有各种格式的常规格式的数据(列名,然后是数字或字符串),以及一列具有[“ x”]格式的各种长度的数字的列表(即第1行= [“ 111”,“ 222”],第2行= [“ 333”],第3行= [“ 555”,“ 666”,“ 777”]。如何上传该数据,以便用它进行分析吗?

当我将其转换为字符串时,数据返回为“ [\“ x \”]“。当我把它变成一个因素时,它看起来像CSV中的格式。但是我仍然无法使用[“ present。

1 个答案:

答案 0 :(得分:0)

您好,您可以使用stringr包从方括号中取出数字。我认为出现\的原因是因为它被用作转义字符以逃避第二组""。无论如何,这将简化它,

我做了一些丑陋的数据

df <- data.frame(x = c(1, 2, 3),
                 y = c('[\\"111\\", \\"222\\"]', '[\\"333\\"]', '[\\"555\\", \\"666\\", \\"777\\"]'))
df
  x                                 y
1 1            [\\"111\\", \\"222\\"]
2 2                       [\\"333\\"]
3 3 [\\"555\\", \\"666\\", \\"777\\"]

现在只需使用来自stringr::str_extract_all的一些正则表达式,我们就可以连续捕获所有出现的1个或多个数字。

df$y <- stringr::str_extract_all(df$y, "(\\d+)")

(\\d+)只是说我想获取1位或更多位数字的组。

这将产生一个嵌套列表,其中不包含\

  x             y
1 1      111, 222
2 2           333
3 3 555, 666, 777

它们仍然是字符串,因此,如果要评估数字,则需要执行以下操作:

> eval(parse(text = df$y[[1]][1])) / 111
[1] 1

对于整个数据框,您可以考虑取消嵌套并创建一个新列(或覆盖原始列以更改数据类型并将字符串转换为valuate(able)表达式,为此,我们可以使用一些{{1 }}(tidyversetidyr::unnest

dplyr::mutate