首页 > 解决方案 > 在 R 中读取包含向量 (c(x,y)) 的 .csv

问题描述

我有点苦恼。我有一堆(数千个).csv 文件,其中几行包含一个数字向量,而不是一个值,我需要将其读入一个 tibble 或数据框中,并将该向量作为字符以进行进一步处理。例如:

"col1","col2","col3"
"a",1,integer(0)
"c",c(3,4),5
"e",6,7

最终应该是

  col1   col2        col3     
  <chr>   <chr>    <chr>   
1 a         1          integer(0)  
2 c         c(3,4)     5
3 e         7          7

该向量仅在“col2”中并且包含整数。该向量通常包含 2 个条目,但可能更多。实际上,中间有两列可以包含多个条目,但我知道两者的位置。

我不知道如何成功地将这些读到 R 中。read.csv 或 read_csv 似乎无法处理它们。有没有一种方法可以在用逗号分隔之前逐行读取文件(幸好它们不长)和 eval() 行?在读取 bash 中的文件之前,我曾考虑用 bash 中的 和 with 替换c("c(并且)必须)"这样做到integer(.

或者,我曾考虑将 bash 中的 .csvs 拆分为包含“正常”行的行和包含向量(grep c()的行,但我不确定如何嵌套 2:length(-1) 的列回到向量中。

但是,我绝对更喜欢在 R 中独立的方法。任何想法都值得赞赏!

标签: rcsv

解决方案


我将您的示例输入到一个 csv 文件中,然后使用 read.csv 将其输入并指定第 2 列是字符。使用 gsub 我替换了字母 c 和左括号和右括号。然后我遍历第 2 列以查找出现逗号的情况并将这些实例转换为整数列表。

data <- read.csv("SO question.csv", colClasses = c("character","character","integer"))

data$col2 <- gsub("(c|\\(|\\))","",data$col2)

for (i in 1:nrow(data)) {
  
  if (grepl(",", data$col2[i]) == TRUE) {
    
    temp <- unlist(strsplit(data$col2[i],","))
    data$col2[i] <- list(as.integer(temp))
    
  } 
}

data

推荐阅读