我希望能够在R中逐行扫描csv文件,并排除包含“target”一词的行。
问题是数据来自不同的地方,而“目标”这个词可能出现在数据框的许多不同列中。
所以我需要一个函数中的一行来查找这个字符串,如果它不存在,那么将该行附加到一个新的数据框(然后我将写成一个新的csv)。
任何和所有的帮助都感激地收到了。
答案 0 :(得分:5)
Andrie的评论可能就是大多数用户会这样做的方式,但是如果你想在舞台阅读时这样做,你可以试试这个:
使用readLines
读取您的csv,并将任何包含 target 文本的行设为空白:
temp = gsub(".*target.*", "", readLines("test.csv"))
使用read.table
将temp
转换为data.frame
。由于所有包含 target 文本的行现在都是空白的,blank.lines.skip=TRUE
中的默认read.table
应正确读取其余数据data.frame
。< / p>
read.table(text=temp, sep=",", header=TRUE)
答案 1 :(得分: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)){
答案 2 :(得分: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