如何重新排列数据?

时间:2013-11-09 18:01:06

标签: r

我在下面有一个示例数据。

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的值。如果有多个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。我编辑了这篇文章。

1 个答案:

答案 0 :(得分: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