向R中的数据框添加一个新列,该列包含每一行中最频繁的值

时间:2020-06-23 19:35:14

标签: r

例如考虑以下数据框:

    X[[i]] X[[i]] X[[i]]
1      1      1      1
2      1      1      2
3      1      2      2
4      0      3      0
5      3      3      3
6      0      3      0
7      4      3      4
8      4      4      4

结果将是:

    X[[i]] X[[i]] X[[i]] output
1      1      1      0      1
2      1      1      2      1
3      1      2      2      2
4      0      3      0      0
5      3      3      3      3
6      0      3      0      0
7      4      3      4      4
8      4      4      4      4

数据框在每次执行中的行数和列数均不同。输出列的值是数字

谢谢。

2 个答案:

答案 0 :(得分:2)

我们可以使用apply遍历行,并使用Mode

cbind(df1, output = apply(df1, 1, FUN = Mode))
#  X[[i]] X[[i]] X[[i]] output
#1      1      1      1      1
#2      1      1      2      1
#3      1      2      2      2
#4      0      3      0      0
#5      3      3      3      3
#6      0      3      0      0
#7      4      3      4      4
#8      4      4      4      4

其中

Mode <- function(x) {
 ux <- unique(x)
 ux[which.max(tabulate(match(x, ux)))]
 }

数据

df1 <- structure(list(`X[[i]]` = c(1L, 1L, 1L, 0L, 3L, 0L, 4L, 4L), 
    `X[[i]]` = c(1L, 1L, 2L, 3L, 3L, 3L, 3L, 4L), `X[[i]]` = c(1L, 
    2L, 2L, 0L, 3L, 0L, 4L, 4L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))

答案 1 :(得分:0)

您要计算的是每一行的mode。以下内容适用于任意数量的行和列:

sudo python test.py >> log.txt&

这将产生:

mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

df$output = apply(df, 1, mode)