r - 对许多列应用相同的标准来计算新列

标签 r dplyr data-manipulation tidyr

我有一个与下面类似的数据框,只不过我有 17 个变量(如 Var1Var2 )而不是 2 个。

df <- read.table(header = TRUE, text = 
          "STUD_ID       Var1   Var2
                 1          0      0
                 1          0      1
                 2          1      2
                 3          3      0", stringsAsFactors = FALSE)

我想创建一个新列,如果 17 个变量中任何一个的值为 1、2 或 3,则输出"is",否则输出“否”。我想要的输出是:

# STUD_ID       Var1   Var2  Output
#       1          0      0    "No"
#       1          0      1   "Yes"
#       2          1      2   "Yes"
#       3          3      0   "Yes"

我尝试了以下代码,但它给出了错误,我不想复制粘贴部分代码 17 次:

df %>%
  mutate(output = if_else(var1 %in% 1:3 |
                          var2 %in% 1:3, 1, 0))

最佳答案

我们可以使用基础R

df$Output <- c("No", "Yes")[Reduce(`|`, lapply(df[-1], `%in%`, 1:3)) + 1]
df$Output
#[1] "No"  "Yes" "Yes" "Yes"
<小时/>

或者使用tidyverse

library(tidyverse)
df %>% 
    mutate_at(vars(matches("Var")), funs(. %in% 1:3)) %>%
    select(-STUD_ID) %>% 
    reduce( `|`) %>% {c('No', 'Yes')[. + 1]} %>% 
    mutate(df, output = .)
#   STUD_ID Var1 Var2 output
#1       1    0    0     No
#2       1    0    1    Yes
#3       2    1    2    Yes
#4       3    3    0    Yes

关于r - 对许多列应用相同的标准来计算新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45433740/

相关文章:

r - 用循环填充矩阵

在 R 或任何其他工具中读取画面数据 (*.tdsx)

r - 如何使用 lower.tri 中的匹配整数填充矩阵的 upper.tri?

r - 如何动态构建字符串并将其传递给 R 中 dplyr 的 mutate() 函数?

r - 仅识别非重复行

r - 使用 R 对面板数据中横截面单位的值求和

r - 如果 R 列中的值不再为真,则在行中查找该值

r - 基于两个变量的条件行计数 (R)

r - 计算与当前行相关的条件匹配的行

python - 将交叉表值与数据框连接起来?