我在下面有一个示例数据。
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。我编辑了这篇文章。
答案 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