R:你如何根据其他变量的分组来做行和?

时间:2017-02-27 22:57:25

标签: r

以下是示例数据:

df <- data.frame("ID1" = c("A","A","B","C"), 
            "Wt1" = c(0.8,0.6,0.4,0.5),
            "ID2" = c("B","A","C","B"),
            "Wt2" = c(0.1,0.4,0.5,0.5),
            "ID3" = c("C",NA,"C",NA), 
            "Wt3" = c(0.1,NA,0.1,NA))

我想在数据框中创建一个列(投票),该列基于来自ID1,ID2,ID3组的wt的argmax。例如,在示例数据的第3行中,&#34; B&#34;的wt的总和。对于&#34; C&#34;是0.4和wt的总和。是0.6,所以投票=&#34; C&#34;。

所以结果就像

  ID1 Wt1 ID2 Wt2  ID3 Wt3 vote
1   A 0.8   B 0.1    C 0.1    A
2   A 0.6   A 0.4 <NA>  NA    A
3   B 0.4   C 0.5    C 0.1    C
4   C 0.5   B 0.5 <NA>  NA    C

在tie的情况下(示例中的第4行),只需选择任何ID值。是否有人建议解决方案?

1 个答案:

答案 0 :(得分:1)

首先,操作像这样格式化的表非常困难。这不是你想要的输出,但我担心你可能会被困在路上。

一个建议是格式化表格,以便我们可以轻松地从中检索信息。

为每个观察分配id

df$obs <- 1:nrow(df)

然后把它们放成长格式

  df1 <- do.call("rbind",lapply(seq(1,6,2),function(x) {df <- df[,c(x: (x+1),7)]; 
colnames(df) <- c("ID","Wt","obs"); df}))

然后我对data.frame的技能有限,所以我切换到data.table包。

dt <- as.data.table(df1)

我们用obs和ID来计算投票数

dt[,total:=sum(Wt,na.rm=TRUE),.(obs,ID)]

然后检索信息非常容易。

dt[,vote:=.SD[which.max(total)],obs]

#dt
#    ID  Wt obs total vote
# 1:  A 0.8   1   0.8    A
# 2:  A 0.6   2   1.0    A
# 3:  B 0.4   3   0.4    C
# 4:  C 0.5   4   0.5    C
# 5:  B 0.1   1   0.1    A
# 6:  A 0.4   2   1.0    A
# 7:  C 0.5   3   0.6    C
# 8:  B 0.5   4   0.5    C
# 9:  C 0.1   1   0.1    A
# 10: NA  NA   2   0.0    A
# 11:  C 0.1   3   0.6    C
# 12: NA  NA   4   0.0    C