3

複数のcsvからRでデータベースを構築しようとしています。各 csv には NA が分散しており、すべての csv を 1 つのデータベースにまとめたマスター リストを作成したいと考えています。これは私の問題を示す簡単なコードです (ほとんどの csv には実際には数千のエントリがあり、このプロセスを自動化したいと考えています)。

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、種などが別々のデータセットで異なる場合、NA 以外のデータが一番上にある方が返されます。その場合、d の行の順序を変更し、変数の順序を変更すると、結果に影響が及ぶ可能性があります。getfirstnonna 関数を変更すると、この動作が変更されます (tail は最後に選択し、すべての可能性を取得することさえあります)。データセットは、最も完全なレコードから順に並べることができます。

于 2012-12-19T21:24:49.817 に答える