【问题标题】:Scanning a csv file for a string in R在 R 中扫描 csv 文件中的字符串
【发布时间】:2012-07-24 16:41:34
【问题描述】:

我希望能够在 R 中逐行扫描 csv 文件并排除包含“目标”一词的行。

问题在于数据来自不同的地方,“目标”一词可能出现在数据框中的许多不同列中。

所以我需要一个函数中的一行来查找这个字符串,如果它不存在,然后将该行附加到一个新的数据帧(然后我将作为一个新的 csv 写出来)。

感谢所有帮助。

【问题讨论】:

  • 反过来做:1)将整个文件读入数据框。 2) 使用greplapply 扫描每一列 3) 删除grep 找到的所有行

标签: r function csv


【解决方案1】:

Andrie 的评论可能是大多数用户的处理方式,但如果你想在阅读阶段这样做,你可以试试这个:

  1. 使用readLines 读取您的 csv,并将任何包含文本 target 的行设为空白:

    temp = gsub(".*target.*", "", readLines("test.csv"))
    
  2. 使用read.tabletemp 转换为data.frame。由于所有包含文本 target 的行现在都是空白的,read.table 中的默认 blank.lines.skip=TRUE 应该正确地读取其余数据作为 data.frame

    read.table(text=temp, sep=",", header=TRUE)
    

【讨论】:

  • 感谢所有回答的人,他们都非常有用。我不知道 grep 函数或 gsub。
【解决方案2】:

使用 readLines:

lines <- readLines(file)
n.lines <- length(lines)
vec.1 <- rep(0, n.lines)
vec.2 <- rep(0, n.lines)
# more vectors as necessary

counter <- 0
for (i in 1:n.lines){           
  this.line <- strplit(lines[i], ",")
  if ("target" %in% this.line) next
  counter <- counter + 1
  vec.1[counter] <- this.line[1]
  vec.2[counter] <- this.line[2]
  # etc.
}

df <- data.frame(vec.1[1:counter], vec.2[1:counter])

如果您的文件有标题,您可能需要稍微更改 n.lines 并更改 for 循环的索引;两行将更改如下:

n.lines <- length(lines) - 1

for(i in 2:(n.lines+1)){

【讨论】:

    【解决方案3】:

    我会调用from.readLines &lt;- readLines(filename),然后只选择不包含目标字符串的行:data &lt;- read.csv(text = from.readLines[-grep('target', from.readLines)], header = F)

    较快的方法(如果您的文件很大)是首先在命令行上运行grep -v 'target' original.csv &gt; new.csv,然后在R 中运行read.csv(new.csv, ...)

    不管怎样,

    > #Without header
    > from.readLines <- c('afaf,afasf,target', 'afaf,target,afasf', 'dagdg,asgst,sagga', 'dagdg,dg,sfafgsgg')
    > data <- read.csv(text = from.readLines[-grep('target', from.readLines)], header = F)
    > print(data)
         V1    V2       V3
    1 dagdg asgst    sagga
    2 dagdg    dg sfafgsgg
    > 
    > #With header
    > from.readLines <- c('var1,var2,var3', 'afaf,afasf,target', 'afaf,target,afasf', 'dagdg,asgst,sagga', 'dagdg,dg,sfafgsgg')
    > data <- read.csv(text = from.readLines[-(grep('target', from.readLines[-1]) + 1)])
    > print(data)
       var1  var2     var3
    1 dagdg asgst    sagga
    2 dagdg    dg sfafgsgg
    

    【讨论】:

      猜你喜欢
      • 2015-10-27
      • 2020-08-29
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多