【问题标题】:Combine, Order, Dedup over Multiple Files in R在 R 中对多个文件进行合并、排序、重复数据删除
【发布时间】:2016-12-23 10:49:42
【问题描述】:

我有大量如下所示的 CSV 文件:

var val1 val2
a 2 1
b 2 2
c 3 3
d 9 2
e 1 1

我想:

  1. 读入
  2. 从每个 CSV 中获取前 3 名
  3. 仅列出变量名称(3 x 文件数)
  4. 只保留列表中的唯一名称

我想我已经通过这样做达到了第 3 点:

csvList <- list.files(path = "mypath", pattern = "*.csv", full.names = T)

bla <- lapply(lapply(csvList, read.csv), function(x) x[order(x$val1, decreasing=T)[1:3], ])

lapply(bla,"[", , 1, drop=FALSE)

现在,我列出了每个 CSV 中的前 3 个变量。但是,我不知道如何将此列表转换为字符串并仅保留唯一值。

欢迎任何帮助。

谢谢!

【问题讨论】:

  • 所以您只需要示例中的a b c?我认为你可以unlist 你的lapply 结果,然后使用unique,它是 dedups/uniqifies。
  • 没错,@Frank。我只想保留a b c 作为列表。 unlist 失败并显示 Error in structure(res, levels = lv, names = nm, class = "factor") : 'names' attribute [450] must be the same length as the vector [9]

标签: r list csv unique lapply


【解决方案1】:

问题在于用drop=FALSE 提取bla 的第一列。这会将结果保留为列列表(其中每一行都有一个name),而不是将其强制为最低维度,即向量。使用 drop=TRUE 代替,然后 unlist 后跟 unique @Frank 建议:

unique(unlist(lapply(bla,"[", , 1, drop=TRUE)))

如您所知,drop=TRUE 是默认值,因此您甚至不必包含它。


更新 cmets 中的新要求。

要保留前两列 varvar1 并删除 var 中的重复项(仅保留唯一的 vars),请执行以下操作:

## unlist each column in turn and form a data frame
res <- data.frame(lapply(c(1,2), function(x) unlist(lapply(bla,"[", , x))))
colnames(res) <- c("var","var1")    ## restore the two column names
## remove duplicates
res <- res[!duplicated(res[,1]),]

请注意,这只会保留每个唯一 var 的第一行。这是这里删除重复的定义。

希望这会有所帮助。

【讨论】:

  • 非常感谢,@aichao。老实说,我是 R 新手,对默认选项一无所知。
  • 作为后续,是否可以保留 var 和 val1(前两列),但仅适用于第一列?
  • @DGenchev:请查看我的更新。我希望这就是您正在寻找的。​​span>
  • 太棒了。有什么办法可以给你买啤酒吗?
  • 谢谢,但没必要!我很乐意提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2018-06-09
  • 2021-12-18
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多