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==1。然后从 中寻找var1==1(户主)classobj==2。复制所有行值var1==1并将其添加为 ``classobj==1 的值。如果超过 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 回答