获取每行最频繁的值并说明关系

Lau*_*ura 5 r count recode

样本数据:

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 行中,EC计数为 2,但E被选中是因为它C在该行之前遇到过。

第6行,类似于第5行,都CE具有计数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)

All*_*ron 6

我认为这实现了你正在寻找的东西。对于每一行,它创建一个每个字母的频率表并选择最大的,同时保留列的顺序。然后它返回该表中第一列的名称。

感谢 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)