0

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

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

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

任何和所有的帮助都非常感激。

4

3 回答 3

5

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

  1. 使用读取您的 csvreadLines并将任何具有文本目标的行设为空白:

    temp = gsub(".*target.*", "", readLines("test.csv"))
    
  2. 用于read.table转换tempdata.frame. 由于具有文本目标的所有行现在都是空白的,因此默认blank.lines.skip=TRUEinread.table应正确读取其余数据为data.frame.

    read.table(text=temp, sep=",", header=TRUE)
    
于 2012-07-24T16:54:22.380 回答
3

使用 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)){
于 2012-07-24T16:50:44.893 回答
1

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

更快的方法(如果您的文件很大)将grep -v 'target' original.csv > new.csv首先在命令行上运行,然后read.csv(new.csv, ...)R.

但不管怎么说,

> #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
于 2012-07-24T18:06:15.420 回答