0

次のようにデータ フレームを変換する方法を教えてください。

    tg  qr  loc a1  a2  a3  b1  b2  b3  c1  c2  c3
1   A   1   89  NA  NA  NA  1   2   3   1   2   3
2   A   1   61  1   2   3   NA  NA  NA  1   2   3
3   A   2   38  4   5   6   NA  NA  NA  NA  NA  NA
4   B   1   40  4   5   6   NA  NA  NA  NA  NA  NA
5   B   1   3   NA  NA  NA  NA  NA  NA  4   5   6

これに:

    tg  qr  loc a1  a2  a3  b1  b2  b3  c1  c2  c3
1   A   1   15  1   2   3   1   2   3   1   2   3
2   A   2   95  4   5   6   NA  NA  NA  NA  NA  NA
3   B   1   42  4   5   6   NA  NA  NA  4   5   6

関数は次のことを行う必要があります。

  • 列 'tg' および 'qr' に同じ値を持つすべての行を 1 つの行にマージします
  • マージ中に、すべての「NA」を既存の値に置き換えます - 反対方向にはなりません
  • 多くの場合、マージされる両方の行に変数が存在する場合がありますが、その値は常に等しくなります (その場合、どの行から取得されるかは問題ではありません)。
  • 「loc」列の値は異なりますが、関連性はありません。列を削除することもできます

これらのサンプル データフレームのコードは次のとおりです。

df = rbind(c("A","1",floor(runif(1,1,100)),c(NA,NA,NA),c(1,2,3),c(1,2,3)),
           c("A","1",floor(runif(1,1,100)),c(1,2,3),c(NA,NA,NA),c(1,2,3)),
           c("A","2",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)),
           c("B","1",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)),
           c("B","1",floor(runif(1,1,100)),c(NA,NA,NA),c(NA,NA,NA),c(4,5,6)))
df = as.data.frame(df)
colnames(df) = c("target","query","loc",c("a1","a2","a3"),c("b1","b2","b3"),c("c1","c2","c3"))

df2 = rbind(c("A","1",floor(runif(1,1,100)),c(1,2,3),c(1,2,3),c(1,2,3)),
            c("A","2",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)),
            c("B","1",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(4,5,6)))
df2 = as.data.frame(df2)
colnames(df2) = c("target","query","loc",c("a1","a2","a3"),c("b1","b2","b3"),c("c1","c2","c3"))

ご支援いただきありがとうございます。

4

2 に答える 2

1

もしかしてこういうこと?

library(data.table)
dt <- data.table(df)
dt <- dt[,lapply(.SD, as.numeric), by = c("target","query")]
dt2 <- dt[,lapply(.SD, mean, na.rm = TRUE), by = c("target","query")]
dt2[is.na(dt2)] <- NA

dt2

> dt2
   target query loc a1 a2 a3 b1 b2 b3 c1 c2 c3
1:      A     1 2.0  1  1  1  1  1  1  1  1  1
2:      A     2 2.0  2  2  2 NA NA NA NA NA NA
3:      B     1 2.5  2  2  2 NA NA NA  2  2  2
于 2013-11-06T18:13:27.780 に答える