基于特定列的许多CSV文件的交集

时间:2019-06-25 14:46:01

标签: r

我在一个目录中有许多csv文件。所有文件都具有相同的列结构,例如:

Class    val1  val2
A        6.5   2.3
F        9     6.8

我想找到所有CSV文件中存在的类的名称。换句话说,我想基于Class列获取所有文件的交集,而与val1val2中的值无关。

我应用了以下内容:

temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
x <- Reduce(intersect,myfiles)

但是这将检索相似的类以及相似的值,这是我不想要的。我只想要所有文件中的类的名称。

1 个答案:

答案 0 :(得分:1)

仅运行没有all=TRUE的链合并。如果最终数据框为空,则NO Class 匹配所有数据集。为避免名称与merge发生冲突,需要执行一个步骤来动态重命名列。在下面通过相应的列表项编号添加下划线后缀。

temp <- list.files(pattern="*.csv")
myfiles <- lapply(temp, read.delim)

# RENAME val1 and val2 COLUMNS TO AVOID merge CONFLICT
myfiles <- lapply(seq_along(myfiles), function(i) 
              setNames(myfiles[[i]], c("Class", paste0("val1_", i), paste0("val2_", i)))) 

# CHAIN MERGE
final_df <- Reduce(function(x, y) merge(x, y, by="Class"), myfiles)

# UNIQUE Class NAMES
unique(final_df$Class)

或者,堆叠所有数据帧并返回等于 myfiles 长度的频率:

temp <- list.files(pattern="*.csv")
myfiles <- lapply(temp, read.delim)

# ROW BIND ALL DFs
stack_df <- do.call(rbind, myfiles)

# RETURN VECTOR OF CLASS VALUES AND COUNTS
freqs <- table(stack$Class)

# RETURN NAME WITH VALUE COUNT EQUAL LENGTH OF myfiles
names(freqs[freqs == length(myfiles)])

Rextester demo