【问题标题】:R Recode Variables In A LoopR在循环中重新编码变量
【发布时间】:2018-08-22 16:25:29
【问题描述】:

喏,

这是一个可复制的示例。

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)

【问题讨论】:

  • Ciao @Salman 样本输出在 df 中。非常感谢

标签: r dplyr paste recode


【解决方案1】:

你可以的

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)

【讨论】:

  • 这真的很好@markus。现在,如果我想操纵重新编码并更具体地说我是否想要三个类别而不是 0 和 1,并说我想要 4、7 和 8,我该怎么做? as.integer(df[,-1] &lt;20, 4, &gt;=20 &amp; &lt;65, 7, &gt;=65, 8) 是我能想到的最好的了
  • 以及如何处理 NA 值?这样TEST1 中的缺失会在TEST1NEW 中产生 NA 而不是 0
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2016-05-29
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多