从许多CSV文件中挑选一列不同长度的列并合并到R中的一个矩阵

时间:2011-11-09 23:27:46

标签: r csv merge dataframe

我有来自dfr.jstor.org的1000个CSV文件,其中有两列,KEYWORDS和WEIGHT。每列的长度因文件而异。这是一个CSV文件的片段:

KEYTERMS  WEIGHT
canoe     1
archaic   0.273
pinus     0.191
florida   0.164

我想使用R从每个CSV文件中获取KEYTERMS列,并将其合并到一个数据框中,如下所示:

KEYTERMS_CSVFILENAME1 KEYTERMS_CSVFILENAME2 KEYTERMS_CSVFILENAME3
thwart                newsom                period 
dugout                site                  cypress 
sigma                 date                  hartmann 
precontact            NA                    florida 
orange                NA                    NA

其中CSVFILENAME1是CSV文件的名称,其中这些关键字来自且NA是空单元格。

我认为我的问题与this one非常相似,区别在于我的列长不同。 This也可能与解决方案相关,而this看起来正确,但我需要一些手握,以使其适合我的情况。提前谢谢!

3 个答案:

答案 0 :(得分:3)

如果您完全不受内存空间的限制,请执行以下操作:

datlist <- lapply(csvnames,read.csv)
maxlen <- max(sapply(datlist,nrow))
pad.NA <- function(x,len) {
   c(x,rep(NA_character_,len-length(x)))
}
keylist <- lapply(datlist,function(x) { pad.na(x[["KEYTERMS"]],maxlen) })
names(keylist) <- paste(KEYTERMS,csvnames,sep="_")
do.call(cbind,keylist)

可能有用(编辑:添加缺失的括号,NA_character_

答案 1 :(得分:3)

为了节省LITTLE内存/时间,您可以像这样修改@Ben Bolker的解决方案:

datlist <- lapply(csvnames,read.csv, colClasses=c("character", "NULL"))
rowseq <- seq_len( max(vapply(datlist,nrow, integer(1))) )
keylist <- lapply(datlist,function(x) { x[[1]][rowseq] ) })
names(keylist) <- paste(KEYTERMS,csvnames,sep="_")
#do.call(cbind,keylist)
do.call(data.frame,keylist)

...我刚改变,只读取了第一列,并通过观察选择一个自动延伸到字符向量区域之外的序列来简化NA填充...

如果你保持旧的填充方式,你应该至少使用NA_character_而不是NA填充,以避免不必要的强制。

我还按编号而不是名称索引KEYTERMS列(因为应该只有一个)。我还将sapply更改为vapply,因为我更喜欢它:) - 它实际上也更快。

最后你说你想要data.frame。最后一行产生的不是矩阵。

答案 2 :(得分:2)

以下是使用ldply中的plyr和来自reshape的{​​{1}}

的稍微简单的解决方案
base