【问题标题】:Read data from a multi separated csv file in R从 R 中的多分隔 csv 文件中读取数据
【发布时间】:2016-01-07 12:34:21
【问题描述】:

我正在尝试将 csv 文件读入 R。问题是该文件有 2 个分隔符,我不知道如何将其作为 3 列数据框读取;即第一、第二和年份。 这是文件外观的示例:

[Alin Deutsch, Mary F. Fernandez, 1998],  
[Alin Deutsch, Daniela Florescu, 1998],

我已经用sep="[" 和sep2="," 尝试了fread() 函数,但它不起作用,R 只是将它作为 1 列向量读取 谢谢

【问题讨论】:

  • 在导入到 R 之前使用 sed 或 awk 或 ... 删除 [?
  • 这些函数是否嵌入到 R 中?
  • 不,那些是(强大而快速的)命令行文本编辑器。您可以在 R 中调用它们。

标签: r csv


【解决方案1】:

1) read.table/sub 使用sep = "," 和comment.char = "]" 读取它。这将拆分字段并删除尾随的] 及其后的所有内容,然后我们可以使用sub 从V1 中删除[:

Lines <- "[Alin Deutsch, Mary F. Fernandez, 1998],  
[Alin Deutsch, Daniela Florescu, 1998],"

DF <- read.table(text = Lines, sep = ",", comment.char = "]", as.is = TRUE,
          strip.white = TRUE, # might not need this one
          col.names = c("Name1", "Name2", "Year"))
DF <- transform(DF, Name1 = sub("[", "", Name1, fixed = TRUE))

给予:

> DF
         Name1             Name2 Year
1 Alin Deutsch Mary F. Fernandez 1998
2 Alin Deutsch  Daniela Florescu 1998

2) read.pattern 另一种可能是在 gsubfn 中使用read.pattern。此模式假定每一行都以 [, 开头有三个逗号,最后一个逗号之前有一个 ]。这对应于问题中的内容,但如果不是这种情况,则需要更改正则表达式。

library(gsubfn)

read.pattern(text = Lines, pattern = ".(.*?),(.*?),(.*?).,", as.is = TRUE,
        strip.white = TRUE, # might not need this one
        col.names = c("Name1", "Name2", "Year"))

给同样的。

【讨论】:

  • 我已经这样做了,它适用于文本数据,但不适用于 csv 文件。它仍然将其读取为一列
  • 如果您指的是(2),如答案中所述,如果您的实际数据与问题中显示的数据有偏差,则必须适当修改模式。
【解决方案2】:

您可以使用sep="," 读取文件,然后删除多余的括号:

df <- read.csv(file = textConnection("[Alin Deutsch, Mary F. Fernandez, 1998],  
[Alin Deutsch, Daniela Florescu, 1998],"),stringsAsFactors=FALSE,head=FALSE)

df <- df[,-4]

df$V1 <- gsub("\\[","",df$V1)
df$V3 <- gsub("\\]","",df$V3)

names(df) <- c("first","second","year")
df

输出

         first             second  year
1 Alin Deutsch  Mary F. Fernandez  1998
2 Alin Deutsch   Daniela Florescu  1998

【讨论】:

    【解决方案3】:

    我已经尝试过这个解决方案,它确实有效。

    首先,我使用gsub从文件中删除了“[”和“]”

    clean <- function(x){
    gsub("\\[|\\]","",x)  
    }
    
    sample_clean <- sapply(sample,clean)
    head(sample_clean)
    

    然后,我使用 str_split_fixed 将列向量分成 3 个列

    data <- str_split_fixed(sample_clean,",",3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多