R中的多个文件的组合,顺序,重复数据删除

时间:2016-08-16 22:25:40

标签: r list csv unique lapply

我有大量的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. 仅保留列表中的唯一名称
  5. 我认为我已经设法通过这样做到达第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个变量。但是,我不知道如何将此列表转换为字符串并仅保留唯一值。

    欢迎任何帮助。

    谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

更新以评论中的新要求。

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

## 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的第一行。这是删除重复项的定义。

希望这有帮助。