我有几个包含一系列数字的文件。我想找出所有文件中的常用数字。例如
a.txt
1
2
3
4
b.txt
2
4
9
c.txt
2
3
4
8
10
输出:2,4
我使用for循环编写的代码给出了正确的结果。
fileList = c("a.txt", "b.txt", "c.txt")
for(i in 1:length(fileList)){
tempDF = read.table(fileList[1], header = T, stringsAsFactors = F)
if(i == 1){
commons = tempDF$x
}else{
commons = intersect(commons, tempDF$x)
}
}
print(commons)
但是我在使用lapply函数重写它时遇到了一些麻烦。 lapply如何保持" commons"变量没有替换?
lapply(fileList, function(x) getCommons(x))
getCommons <- function(file){
fileData = read.table(file, header = T, stringAsFactor = F)
commons = intersect(commons, fileData)
}
答案 0 :(得分:3)
你可以在这里充分利用Reduce
。而且,由于在每个文件中您都有一个不一定是数据框的列(没有列名称),我们可以将read.table
替换为scan
。这将生成一个包含三个数字向量的列表,使查找交集更容易,更快捷。
Reduce(intersect, lapply(files, scan, quiet = TRUE))
# [1] 2 4
数据创建:
write(1:4, file = "a.txt", sep = "\n")
write(c(1, 2, 4, 9), file = "b.txt", sep = "\n")
write(c(2, 3, 4, 8, 10), file = "c.txt", sep = "\n")
files <- c("a.txt", "b.txt", "c.txt")