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