【问题标题】:Need to change multiple values across multiple variables需要跨多个变量更改多个值
【发布时间】:2019-10-22 10:52:16
【问题描述】:

我有 72 个变量来表示孩子是否能够阅读 72 个单词。这些变量实际上编码为""(空)、"!""1",分别表示孩子是否得到了单词正确未达到 ,或不正确。值被编码为字符串。这是tibble的摘录

lit <- data.frame(rbind(c("1", "", "", ""),
           c("", "1", "1", "1"),
           c("!", "", "", ""),
           c("!", "", "", "")))

lit
  X1 X2 X3 X4
1  1         
2     1  1  1
3  !         
4  !         

我需要将它们分别重新编码为 1NA0 以执行一些统计信息(例如,正确的字数、平均数等)。我期待以下输出:

lit
  X1 X2 X3 X4
1  0  1  1  1
2  1  0  0  0
3 NA  1  1  1
4 NA  1  1  1

我尝试了以下代码

for(k in words) {
if(lit[[k]][lit[[k]] == ""]){
    lit[[k]][lit[[k]]] <- 1
  }
  else {lit[[k]][lit[[k]]] <- 0
     }}

words 实际上是一个向量,其中包含我需要重新编码的变量名称。在您在这里看到的for 循环中,我很乐意仅将正确的单词重新编码为 1,其余的都重新编码为 0,尽管NA 的选项将是首选。

运行for 循环后,我收到以下消息:

Error in if (lit[[k]][lit[[k]] == ""]) { : 
  argument is not interpretable as logical
In addition: Warning message:
In if (lit[[k]][lit[[k]] == ""]) { :
  the condition has length > 1 and only the first element will be used

非常感谢任何帮助,特别是如果使用 dplyr,我目前正在尝试改进

【问题讨论】:

  • 欢迎来到 SO!请花时间阅读how to create a reproducible example。特别是,您的数据样本或类似的假数据会很有用。尝试使用dput
  • 谢谢@h-1,这很好用。还有一个问题,如果我不需要对所有列进行变异,我如何子集我想要变异的列?我有一些变量,比如年龄和性别,我想保持原样
  • 使用mutate_at(vars(-age, -gender), ~c(1, NA, 0)[match(.x, c("", "!", "1"))])
  • 我收到一个错误Error in eval(variables_names, envir = envir, enclos = baseenv()) : object 'age' not found。我在lit 之后传送了您的代码
  • 在检查了mutate_at 的帮助文件和几次尝试和错误之后,我终于成功地运行了代码。 mutate_at 需要将变量作为列名的字符向量。所以我的最终代码类似于lit %&gt;% mutate_at(c("var_1", "var_2", "...", "var_n"), ~c(1, NA, 0)[match(.x, c("", "!", "1"))])

标签: r for-loop dplyr subset recode


【解决方案1】:

您可以使用match() 的结果来索引替换值的向量。

library(dplyr)

lit %>%
  mutate_all(~c(1, NA, 0)[match(.x, c("", "!", "1"))])  

  X1 X2 X3 X4
1  0  1  1  1
2  1  0  0  0
3 NA  1  1  1
4 NA  1  1  1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2018-05-18
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多