繁体   English   中英

R循环编码变量

[英]R Recode Variables In A Loop

再见,

这是一个可复制的示例。

df <- data.frame("STUDENT"=c(1,2,3,4,5),
                 "TEST1"=c(6,88,17,5,18),
                 "TEST2"=c(34,NA,87,88,82),
                 "TEST3"=c(87,62,13,8,71),
                 "TEST1NEW"=c(0,1,0,0,0),
                 "TEST2NEW"=c(0,NA,1,1,1),
                 "TEST3NEW"=c(1,1,0,0,1)

如果我具有带有STUDENT,TEST1,TEST2,TEST3的数据帧df,则我想将TEST1NEW TEST2NEW和TEST3NEW设置为使得当旧变量TEST大于或等于50且新TEST变量应等于时,新变量等于1。当旧的TEST变量低于50时,将其设置为0。我在下面进行了尝试,但这还不够,而且我认为这可能需要循环。

COLUMNS <- c("TEST1", "TEST2", "TEST3")
df[paste0(COLUMNS)] <- replace(df[COLUMNS],df[COLUMNS] < 50, 0 , 1, NA)

你可以做

df[, paste0("TEST", 1:3, "_NEW")] <- as.integer(df[,-1] >= 50)
df
#  STUDENT TEST1 TEST2 TEST3 TEST1_NEW TEST2_NEW TEST3_NEW
#1       1     6    34    87         0         0         1
#2       2    88    NA    62         1        NA         1
#3       3    17    87    13         0         1         0
#4       4     5    88     8         0         1         0
#5       5    18    82    71         0         1         1

数据

df <- data.frame(
  "STUDENT" = c(1, 2, 3, 4, 5),
  "TEST1" = c(6, 88, 17, 5, 18),
  "TEST2" = c(34, NA, 87, 88, 82),
  "TEST3" = c(87, 62, 13, 8, 71)
)

如果分配更加复杂,我们可以使用dplyr::case_when

library(dplyr)
df[, paste0("TEST", 1:3, "_NEW")] <- case_when(df[,-1] < 20 ~ 4L,
                                               df[,-1] >= 65 ~ 8L,
                                               is.na(df[,-1]) ~ NA_integer_,
                                               TRUE ~ 7L)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM