2016-08-16 26 views
0

我有大量的CSV文件看起来像这样的:到结合,订单,去重复在多个文件中的R

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

我想:

  1. 阅读他们
  2. 从每个CSV中取前三名
  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个变量的列表。但是,我不知道如何将此列表转换为字符串并只保留唯一值。

任何帮助,欢迎。

谢谢!

+0

所以你只是想从例子中'a b c'?我认为你可以'取消'你的'lapply'结果,然后使用'unique',这可以解释/取消。 – Frank

+0

没错,@Frank。我只想保留'a b c'作为列表。 'unlist'失败,结构错误(res,levels = lv,names = nm,class =“factor”): 'names'属性[450]必须与向量[9]的长度相同' – DGenchev

回答

1

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

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

如你所知,drop=TRUE是默认的,所以你甚至不必将其列入。


更新在评论新的要求。

为了保持前两列varvar1var删除重复项(只保留了独特的var S),请执行下列操作:

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

希望这会有所帮助。

+0

非常感谢,@aichao。说实话,我是R新手,对默认选项完全无能为力。 – DGenchev

+0

作为后续工作,是否可以保留var和val1(前两列),但仅对第一个唯一应用? – DGenchev

+0

@DGenchev:请参阅我的更新。我希望那是你正在寻找的。 – aichao