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 时新变量等于 1,而 NEW当旧的 TEST 变量低于 50 时,TEST 变量应等于 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)
再见,
这是一个可复制的例子。
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 时新变量等于 1,而 NEW当旧的 TEST 变量低于 50 时,TEST 变量应等于 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)