3

我正在尝试从多个 csvs 在 R 中构建一个数据库。每个 csv 都有 NA,我想建立一个主列表,将所有 csv 汇总在一个数据库中。这是一些说明我的问题的快速代码(大多数 csvs 实际上有 1000 个条目,我想自动化这个过程):

d1=data.frame(common=letters[1:5],species=paste(LETTERS[1:5],letters[1:5],sep='.'))
d1$species[1]=NA
d1$common[2]=NA
d2=data.frame(common=letters[1:5],id=1:5)
d2$id[3]=NA
d3=data.frame(species=paste(LETTERS[1:5],letters[1:5],sep='.'),id=1:5)

我一直在兜圈子(写循环),试图在没有太多运气的情况下使用合并和重塑(熔化/铸造),以简洁地总结可用的信息。这似乎很基本,但我想不出一个好的方法来做到这一点。提前致谢。

To be clear, I am aiming for a final database like this:
  common species id
1      a     A.a  1
2      b     B.b  2
3      c     C.c  3
4      d     D.d  4
5      e     E.e  5
4

1 回答 1

0

我最近也有类似的情况。下面将遍历所有变量并返回最可能的信息以添加回数据集中。一旦所有数据都在那里,对第一个变量运行最后一次将为您提供结果。

#combine all into one dataframe
require(gtools)
d <- smartbind(d1,d2,d3)

#function to get the first non NA result
getfirstnonna <- function(x){
  ret <- head(x[which(!is.na(x))],1)
  ret <- ifelse(is.null(ret),NA,ret)
  return(ret)
}

#function to get max info based on one variable
runiteration <- function(dataset,variable){
  require(plyr)
  e <- ddply(.data=dataset,.variables=variable,.fun=function(x){apply(X=x,MARGIN=2,FUN=getfirstnonna)})
  #returns the above without the NA "factor"
  return(e[which(!is.na(e[ ,variable])), ])
}

#run through all variables
for(i in 1:length(names(d))){
  d <- rbind(d,runiteration(d,names(d)[i]))
}
#repeat first variable since all possible info should be available in dataset
d <- runiteration(d,names(d)[1])

如果 id、species 等在不同的数据集中不同,那么这将返回位于顶部的任何非 NA 数据。在这种情况下,更改 d 中的行顺序和更改变量顺序可能会影响结果。更改 getfirstnonna 函数将改变这种行为(tail 会最后选择,甚至可能获得所有可能性)。您可以根据最完整的记录对数据集进行排序。

于 2012-12-19T21:24:49.817 回答