下面的代码根据Methods 1, 2, 3 and 4获得的值生成mode值.但请注意,在某些情况下,我有正确的模式值,例如alternatives 3 and 4,但有错误的模式值,例如在alternative 5中,因为它有两个值7和两个值6,但mode的值显示为6.此外,在alternatives 11 and 12中,它没有mode值,因为这两种方法的值不同.对于这些不正确的情况,也就是说,当我对同一个备选方案有两个相等的值时,当我没有模式值时,我想把由Method 1获得的值视为mode值.我在下面插入了正确的输出.

可执行代码如下:

database<-structure(list(Alternatives = c(3, 4, 5, 6, 7, 8, 9, 10, 11, 12), 
                         Method1 = c(1L, 10L, 7L, 8L, 9L, 6L, 5L, 3L, 4L, 2L), Method2 = c(1L, 
8L, 6L, 7L, 10L, 9L, 4L, 2L, 5L, 3L), Method3 = c(1L, 
10L, 7L, 8L, 9L, 6L, 4L, 2L, 3L, 5L), Method4 = c(1L, 
9L, 6L, 7L, 10L, 8L, 5L, 3L, 2L, 4L)), class = "data.frame", row.names = c(NA, 
10L))

ModeFunc <- function(Vec) {
  tmp <- sort(table(Vec),decreasing = TRUE)
  Nms <- names(tmp)
  if(max(tmp) > 1) {
    as.numeric(Nms[1])
  } else NA}


output <- database |> rowwise() |> 
  mutate(Mode = ModeFunc(c_across(Method1:Method4))) %>% 
  data.frame()

> output
   Alternatives Method1 Method2 Method3 Method4 Mode
1             3       1       1       1       1    1
2             4      10       8      10       9   10
3             5       7       6       7       6    6
4             6       8       7       8       7    7
5             7       9      10       9      10    9
6             8       6       9       6       8    6
7             9       5       4       4       5    4
8            10       3       2       2       3    2
9            11       4       5       3       2   NA
10           12       2       3       5       4   NA

正确的输出将是:

Alternatives Method1 Method2 Method3 Method4 Mode
       3       1       1       1       1      1
       4      10       8      10       9      10
       5       7       6       7       6      7
       6       8       7       8       7      8
       7       9      10       9      10      9
       8       6       9       6       8      6
       9       5       4       4       5      5
      10       3       2       2       3      3
      11       4       5       3       2      4
      12       2       3       5       4      2

推荐答案

你可以使用一些传统的mode()函数,

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

并使用mapply中的ifelse更新值.

mds <- apply(database[-1], 1, mode) |> setNames(database$Alternatives)
mapply(\(x, y) ifelse(length(x) > 1, y, x), mds, database$Method1)
# 3  4  5  6  7  8  9 10 11 12 
# 1 10  7  8  9  6  5  3  4  2 

因此,总的来说,它可能看起来像这样:

database |>
  cbind(Mode=mapply(\(x, y) ifelse(length(x) > 1, y, x), 
                    apply(database[-1], 1, mode), 
                    database$Method1))
#    Alternatives Method1 Method2 Method3 Method4 Mode
# 1             3       1       1       1       1    1
# 2             4      10       8      10       9   10
# 3             5       7       6       7       6    7
# 4             6       8       7       8       7    8
# 5             7       9      10       9      10    9
# 6             8       6       9       6       8    6
# 7             9       5       4       4       5    5
# 8            10       3       2       2       3    3
# 9            11       4       5       3       2    4
# 10           12       2       3       5       4    2

R相关问答推荐

查找满足SpatRaster中条件的单元格位置

geom_Ribbon条件填充创建与数据不匹配的形状(ggplot 2 r)

如何根据组大小应用条件过滤?

在R中替换函数中的特定符号

修改用R编写的用户定义函数

在某些栏和某些条件下,替换dfs列表中的NA

将数据集中的值增加到当前包含的最大值

是否可以创建一个ggplot与整洁判断的交互作用

在嵌套列表中查找元素路径的最佳方法

Geom_Hline将不会出现,而它以前出现了

WRS2包中带有bwtrim的简单ANOVA抛出错误

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

层次树图的数据树

如何在AER::ivreg中指定仪器?

按镜像列值自定义行顺序

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

条形图中的条形图没有try 赋予它们的 colored颜色

如何将字符类对象中的数据转换为R中的字符串

根据向量对列表元素进行排序

如何 suppress 条形图中的零条?