我在一个目录中有许多csv文件。所有文件都具有相同的列结构,例如:
Class val1 val2
A 6.5 2.3
F 9 6.8
我想找到所有CSV文件中存在的类的名称。换句话说,我想基于Class
列获取所有文件的交集,而与val1
和val2
中的值无关。
我应用了以下内容:
temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
x <- Reduce(intersect,myfiles)
但是这将检索相似的类以及相似的值,这是我不想要的。我只想要所有文件中的类的名称。
答案 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)])