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

nimxete2  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(130)

我试图自动创建变量,表明学生的答案(变量开始与l,m,f或g)的问题(例如,变量开始在“测试_”)是正确的或不。即。这是通过检查是否,例如,test_l1 == l1。
我不知道如何做到这一点,除了使用索引,但它是非常繁琐的,并创建了大量的代码。
下面是一个模拟实际数据集结构的玩具数据集,它有4种不同的测试,每种测试有12个练习。(test_l1 ~ test_l12,test_m1 ~ test_m12,test_f1~,test_g1 ~)和相应的学生响应(l1~l12,m1~m12,f1~,g1~)。我想创建48个变量,即correct_l1 ~ correct_l12,correct_m1~,correct_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))

字符串
非常感谢提前!

mznpcxlj

mznpcxlj1#

这里有一个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

字符串

b5buobof

b5buobof2#

获取test_cols中的所有'test'列,从test_cols中删除字符串'test_'以获取相应的列进行比较。
直接比较这两个嵌套框并创建新列。

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表示答案错误。

相关问题