【发布时间】: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 !
我需要将它们分别重新编码为 1、NA 和 0 以执行一些统计信息(例如,正确的字数、平均数等)。我期待以下输出:
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 %>% mutate_at(c("var_1", "var_2", "...", "var_n"), ~c(1, NA, 0)[match(.x, c("", "!", "1"))])
标签: r for-loop dplyr subset recode