基于现有列创建多个新列 (dplyr)

时间:2021-07-12 12:37:01

标签: r dplyr multiple-columns

我正在尝试自动创建变量,以指示学生对问题的答案(以 l、m、f 或 g 开头的变量)(例如,以“test_”开头的变量)是否正确。 IE。这是通过检查是否,例如,test_l1 == l1 来完成的。

除了使用索引之外,我不知道如何做到这一点,但它非常乏味并且创建了大量代码。

下面是一个模拟实际数据集结构的玩具数据集,它有 4 种不同类型的测试,每种测试有 12 个练习(test_l1 ~ test_l12、test_m1 ~ test_m12、test_f1~、test_g1~)和相应的学生反应(l1~l12 , m1~m12, f1~, g1~)。我想创建 48 个变量,即正确_l1~正确_l12、正确_m1~、正确_f1~等)

df<-data.frame(test_l1 = c(1,0,0), test_l2=c(1,1,1), test_m1 = c(0,1,0), test_m2=c(0,1,1), l1=c(0,1,0), l2=c(1,1,1), m1=c(1,1,1), m2=c(0,0,1))

非常感谢!

2 个答案:

答案 0 :(得分:1)

获取'test'中的所有test_cols列,去掉'test_'中的字符串test_cols,得到对应的列进行比较。

直接比较两个数据框并创建新列。

test_cols <- grep('test', names(df), value = TRUE)
ans_cols <- sub('test_', '', test_cols)
df[paste0('correct_', ans_cols)] <- df[test_cols] == df[ans_cols]

df
#  test_l1 test_l2 test_m1 test_m2 l1 l2 m1 m2 correct_l1 correct_l2 correct_m1 correct_m2
#1       1       1       0       0  0  1  1  0      FALSE       TRUE      FALSE       TRUE
#2       0       1       1       1  1  1  1  0      FALSE       TRUE       TRUE      FALSE
#3       0       1       0       1  0  1  1  1       TRUE       TRUE      FALSE       TRUE

其中 TRUE 表示答案正确,FALSE 表示答案错误。

答案 1 :(得分:1)

这是您可以使用的 tidyverse 解决方案:

library(dplyr)

df %>%
  mutate(across(starts_with("test_"), ~ .x == get(sub("test_", "", cur_column())), 
                .names = '{gsub("test_", "answer_", .col)}'))

  test_l1 test_l2 test_m1 test_m2 l1 l2 m1 m2 answer_l1 answer_l2 answer_m1 answer_m2
1       1       1       0       0  0  1  1  0     FALSE      TRUE     FALSE      TRUE
2       0       1       1       1  1  1  1  0     FALSE      TRUE      TRUE     FALSE
3       0       1       0       1  0  1  1  1      TRUE      TRUE     FALSE      TRUE