我有来自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看起来正确,但我需要一些手握,以使其适合我的情况。提前谢谢!
答案 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