首页 > 解决方案 > 多个 if-else 条件的最简单方法是什么?

问题描述

我有一个类似这样的数据集:

df_1 <- tribble(
  ~A,   ~B,  ~C,  
  10,   10,  NA,        
  NA,   34,  15,       
  40,   23,  NA,
   4,   12,  18,
)

现在,我只想比较每一行的 A、B、C,并添加一个新列来显示最小数量。让我们看看想要的数据是什么样子的:

df_2 <- tribble(
  ~A,  ~B,  ~C,  ~Winner,
  10,  10,  NA,  "Same",     
  NA,  34,  15,  "C",     
  40,  23,  NA,  "B",   
   4,  12,  18,  "A",
)

有四种输出:Same、A-Win、B-Win、C-Win。

您将如何编码以获得此结果?

提前致谢。

标签: rdplyr

解决方案


这里有一些东西:

foo <- function(x) {
  rmin <- which(x == min(x, na.rm = TRUE))
  if (length(rmin) > 1) "same" else names(rmin)
}
apply(df_1, 1,  foo)

[1] "same" "C"    "B"    "A"  

您可以将其作为一列添加到您的 data.frame 中:

df_1$winner <- apply(df_1, 1,  foo)

# A tibble: 4 x 4
      A     B     C winner
  <dbl> <dbl> <dbl> <chr> 
1    10    10    NA same  
2    NA    34    15 C     
3    40    23    NA B     
4     4    12    18 A    

如果您有更多变量并且只想使用一些变量,则可以使用字符向量:

vars <- c("A", "B", "C")
apply(df_1[vars], 1,  foo)

推荐阅读