0

以下にサンプルデータがあります。

classobj    var1    var2    var3    var4
       1       2       0      10       4
       2       1       1      64       2
       2       3       1      15       2
       2       1       2      46       1
       2       3       1      13       1
       1       2       0      10       4
       2       1       1      45       2
       2       2       2      45       2
       2       3       1      11       1
       2       3       2       9       1

classobj=1は世帯であり、世帯classobj==2のメンバーです。したがって、データのこの部分は 1 つの世帯に属します。

 classobj   var1    var2    var3    var4
        1      2       0      10       4
        2      1       1      64       2
        2      3       1      15       2
        2      1       2      46       1
        2      3       1      13       1

私がしたいのは、 の行のすべての値を削除することですclassobj==1var1==1次に、から (家長) を探しますclassobj==2。のすべての行の値をコピーしvar1==1、それを ``classobj==1.' の値として追加します。複数ある場合はvar==1、var3 を探します。最も高い値を持つ var3 の値をコピーします。

編集済み:出力はこれである必要があります

classobj    var1    var2    var3    var4
       1       1       1      64       2
       2       1       1      64       2
       2       3       1      15       2
       2       1       2      46       1
       2       3       1      13       1
       1       1       1      45       2
       2       1       1      45       2
       2       2       2      45       2
       2       3       1      11       1
       2       3       2       9       1

このコードを使用してすべての値を削除する予定ですclassobj==1

DF[DF$Classobj == 1, 2:4] <- NA

残りの問題は、その値をどのように検索しvar1==1てコピーできるかということです。

PS。

ごめん。var2 ではなく var3 にする必要があります。投稿を編集しました。

4

1 に答える 1

1

質問に何かが欠けている、または読み間違えているような気がしますが、これらの線に沿って考えています-

library(data.table)
dt <- data.table(df)

# columns for which value is to be copied
valuecolumns = setdiff(colnames(dt),'classobj')

# marking each family with a unique flag
dt[,flag := 0]
dt[classobj == 1,flag := 1]
dt[,flag := cumsum(flag)]

# temporarily removing the classobj == 1 rows
dt <- dt[classobj != 1]

# marking cases where unique var1 = 1 is there
dt[,var1eq1 := .SD[var1 == 1, .N], by = 'flag']

# re-addingclassobj == 1 rows where multiple var1 == 1 exist
dt <- rbind(dt,dt[var1eq1 > 1 & classobj != 1, .SD[which.max(var2)], by = 'flag'][,classobj := as.integer(1)])
# re-addingclassobj == 1 rows with max var2 values
dt <- rbind(dt,dt[var1eq1 == 1 & classobj != 1, .SD[var1 == 1], by = 'flag'][,classobj := as.integer(1)])

出力 -

> dt
    classobj var1 var2 var3 var4 flag var1eq1
 1:        2    1    1   64    2    1       2
 2:        2    3    1   15    2    1       2
 3:        2    1    2   46    1    1       2
 4:        2    3    1   13    1    1       2
 5:        2    1    1   45    2    2       1
 6:        2    2    2   45    2    2       1
 7:        2    3    1   11    1    2       1
 8:        2    3    2    9    1    2       1
 9:        1    1    2   46    1    1       2
10:        1    1    1   45    2    2       1
于 2013-11-09T18:53:20.983 に答える