2

3つのデータフレームがあります。最初の(列ヘッダーはありますが、行番号はありません)は次のようになります。

ID    1   2   3
 A   12  NA  NA
 B   NA   7  NA
 C   NA  NA  22

2番目は次のようになります

ID    1   2   3
 A   NA   6  NA
 B   NA  NA  29
 C   43  NA  NA

最後に、3番目は次のようになります

ID    1   2   3
 A   NA  NA  32
 B    5  NA  NA
 C   NA   2  NA  

最初の列はID列であり、3つのデータフレームすべてで同じです。最後の3つの列は、同じ変数(1、2、および3)を表します。観測値Aのレコードである変数1は、データセットの1つにのみ含まれています。観測値A、変数2のレコードも同様ですが、別のデータセットにあります。

これらのデータセットをマージして、次のようなものを取得するにはどうすればよいですか?

ID    1   2   3
 A   12   6  32
 B    5   7  29
 C   43   2  22

この問題を説明するためのより良い方法がなかったことをお詫び申し上げます。誰かがその用語を共有できれば、それは素晴らしいことです。

4

3 に答える 3

2

私はそれを思いつきませんでしたが:

merge.new<-function(...,col.ID){
    inter<-merge(...)
    inter<-inter[order(inter[col.ID]),] #merged data sorted by ID

    #total columns and rows for the target dataframe
    total.row<-length(unique(inter[[col.ID]]))
    total.col<-dim(inter)[2]
    row.ID<-unique(inter[[col.ID]])
    target<-matrix(NA,total.row,total.col)
    target<-as.data.frame(target)
    names(target)<-names(inter)

    for (i in 1:total.row){
        inter.part<-inter[inter[col.ID]==row.ID[i],] #select all rows with the same ID
        for (j in 1:total.col){
            if (is.na(inter.part[1,j])){
                if(is.na(inter.part[2,j])) {target[i,j]=NA}
                else {target[i,j]=inter.part[2,j]}
            }
            else {target[i,j]=inter.part[1,j]}

        }
    }
print(paste("total rows=",total.row))
print(paste("total columns=",total.col))
return(target)
}

データの名前が1、2、3の場合:

> one
  ID  1  2  3
2  A 12 NA NA
3  B NA  7 NA
4  C NA NA 22
> two
  ID  1  2  3
2  A NA  6 NA
3  B NA NA 29
4  C 43 NA NA
> three
  ID  1  2  3
2  A NA NA 32
3  B  5 NA NA
4  C NA  2 NA
> merge.new(merge.new(one, two, all=TRUE, col.ID=1), three, all=TRUE, col.ID=1)
[1] "total rows= 3"
[1] "total columns= 4"
[1] "total rows= 3"
[1] "total columns= 4"
  ID  1 2  3
1  A 12 6 32
2  B  5 7 29
3  C 43 2 22
> 
于 2012-04-03T23:28:53.033 に答える
2

データフレームを使用してこれを直接実行できるかどうかはわかりませんが、そうでない場合は、最初にデータフレームを行列に変換するのは非常に簡単です。

x <- matrix(c(12,NA,NA,NA,7,NA,NA,NA,22),3,3)
y <- matrix(c(NA,NA,43,6,NA,NA,NA,29,NA),3,3)
z <- matrix(c(NA,5,NA,NA,NA,2,32,NA,NA),3,3)
b <- matrix(0,3,3)
b[!is.na(x)] <- x[!is.na(x)]
b[!is.na(y)] <- y[!is.na(y)]
b[!is.na(z)] <- z[!is.na(z)]
b
     [,1] [,2] [,3]
[1,]   12    6   32
[2,]    5    7   29
[3,]   43    2   22
于 2012-04-04T00:57:19.313 に答える
1

いいタイトル!これはRと非常によく似ています-ベクトル/配列の加算

データを多次元配列に変換してから、「パズルのピース」の次元全体の平均を合計または取得できます。

df1 <- read.table(text="ID    1   2   3
A   12  NA  NA
B   NA   7  NA
C   NA  NA  22", header = TRUE)

df2 <- read.table(text="ID    1   2   3
A   NA   6  NA
B   NA  NA  29
C   43  NA  NA", header = TRUE)

df3 <- read.table(text="ID    1   2   3
A   NA  NA  32
B    5  NA  NA
C   NA   2  NA", header = TRUE)

# gather inputs and remove common ID column
lists  <- list(df1, df2, df3)
pieces <- lapply(lists, '[', , -1)

# turn data into a multi-dimensional array
a <- array(unlist(pieces), dim = c(nrow(df1),
                                   ncol(df1) - 1,
                                   length(pieces)))

# compute sums across pieces
rowSums(a, na.rm = TRUE, dims = 2)
# [,1] [,2] [,3]
# [1,]   12    6   32
# [2,]    5    7   29
# [3,]   43    2   22

そうすれば、ID列を貼り付けるだけで済みます。

于 2012-04-04T00:51:46.677 に答える