样本数据:
df <- data.frame("ID" = 1:6,
"Group1" = c("A", NA, "C", NA, "E", "C"),
"Group2" = c("E", "C", "C", NA, "E", "E"),
"Group3" = c("A", "A", NA, NA, "C", NA),
"Group4" = c(NA, "C", NA, "D", "C", NA),
"Group5" = c("A", "D", NA, NA, NA, NA))
Run Code Online (Sandbox Code Playgroud)
在每一行中,我想计算每个值的数量并将最频繁的值存储在一个新变量中New.Group。在平局的情况下,应选择行中的第一个值。应用于示例的逻辑:
的第 1 行New.Group取值,A因为它是该行中出现频率最高的值,忽略NAs。
第 2 行有价值,C因为它也是最常见的值。
第 3 行与第 2 行相同。
第 4 行具有值,D因为它是该行中唯一的值。
在第 5 行中,E和C计数为 2,但E被选中是因为它C在该行之前遇到过。
第6行,类似于第5行,都C和E具有计数1,但C被选中,因为它是之前遇到E了一排。
所需的输出:
ID Group1 Group2 Group3 Group4 Group5 New.Group
1 1 A E A <NA> A A
2 2 <NA> C A C D C
3 3 C C <NA> <NA> <NA> C
4 4 <NA> <NA> <NA> D <NA> D
5 5 E E C C <NA> E
6 6 C E <NA> <NA> <NA> C
Run Code Online (Sandbox Code Playgroud)
我认为这实现了你正在寻找的东西。对于每一行,它创建一个每个字母的频率表并选择最大的,同时保留列的顺序。然后它返回该表中第一列的名称。
感谢 Henrik 提出改进建议。
df$New.Group <- apply(df[-1], 1, function(x) {
names(which.max(table(factor(x, unique(x)))))
})
df
#> ID Group1 Group2 Group3 Group4 Group5 New.Group
#> 1 1 A E A <NA> A A
#> 2 2 <NA> C A C D C
#> 3 3 C C <NA> <NA> <NA> C
#> 4 4 <NA> <NA> <NA> D <NA> D
#> 5 5 E E C C <NA> E
#> 6 6 C E <NA> <NA> <NA> C
Run Code Online (Sandbox Code Playgroud)