【问题标题】:Pick up one column of varying lengths from many CSV files and merge to one matrix in R从许多 CSV 文件中提取一列不同长度的列并合并到 R 中的一个矩阵
【发布时间】:2011-12-25 18:27:06
【问题描述】:

我有 1000 个来自 dfr.jstor.org 的 CSV 文件,包含两列,KEYWORDS 和 WEIGHT。每列的长度因文件而异。这是一个 CSV 文件的 sn-p:

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 看起来很合适,但我需要一些帮助才能使其适合我的情况。提前致谢!

【问题讨论】:

  • 这是相当开放的。您如何开始使用链接到的问题中的信息,然后在遇到特定问题时返回?
  • 好吧,我不确定从哪里开始!任何提示或线索将不胜感激。
  • 尝试只将两个 csv 读入 R,看看是否可以合并它们。
  • 对,我可以得到两个 csv 文件并使用 cbind 和函数 here 合并它们。下一步要去哪里?

标签: r csv merge dataframe


【解决方案1】:

为了节省一点内存/时间,您可以像这样修改@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 填充...

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

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

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

【讨论】:

  • 这很有帮助,非常感谢!我刚刚在[rowseq] 之后将) 从第二行中取出,并将KEYTERMS 更改为"KEYTERMS",它完美地完成了这项工作。很有启发性,再次感谢。
【解决方案2】:

如果您完全不受内存空间的限制,例如:

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_

【讨论】:

  • 谢谢,我可以看到你在那里用 lapply 和 sapply 做了什么,这很有帮助。但是我在块的末尾收到了这条消息Error: unexpected '}' in: "c(x,rep(NA,len-length(x)) }"...
  • .@Ben - 添加一个结束括号然后:c(x,rep(NA,len-length(x)))
【解决方案3】:

这是一个稍微简单的解决方案,使用来自plyrldply 和来自basereshape

# READ CSV FILES INTO LIST (i am using a dummy datlist for illustration)
# datlist <- lapply(csvnames,read.csv, colClasses=c("character", "NULL"))
datlist <- list(
  file1 = data.frame(KEYWORDS = c('thwart', 'dugout', 'sigma', 'precontact')),
  file2 = data.frame(KEYWORDS = c('newsom', 'site', 'date'))
)

# BIND THEM INTO A DATAFRAME AND RESHAPE TO DESIRED FORM
datdf <- plyr::ldply(datlist, function(x) data.frame(x, id = 1:NROW(x)))
reshape(datdf, timevar = '.id', direction = 'wide', sep = "_") 

   id KEYWORDS_file1 KEYWORDS_file2
1  1         thwart         newsom
2  2         dugout           site
3  3          sigma           date
4  4     precontact           <NA>

【讨论】:

    最近更新 更多