以下是示例数据:
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值。是否有人建议解决方案?
答案 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