【发布时间】:2021-05-14 09:26:15
【问题描述】:
我有一个数据框,其中包含调查对象对某些项目的回答(列:var1、var2、var3、...)。还有一列指示受访者看到了哪些项目 (vars_seen)。数据框如下所示:
df <- data.frame(list(var1=c(-99,1,1,-99,1,1),
var2=c(-99,-99,1,1,-99,1),
var3=c(-99,-99,-99,-99,1,1),
vars_seen=c("var1", "var1", "var1,var2", "var1,var2", "var1,var2,var3", "var1,var2,var3")))
| var1 | var2 | var3 | vars_seen |
|---|---|---|---|
| -99 | -99 | -99 | var1 |
| 1 | -99 | -99 | var1 |
| 1 | 1 | -99 | var1,var2 |
| -99 | 1 | -99 | var1,var2 |
| 1 | -99 | 1 | var1,var2,var3 |
| 1 | 1 | 1 | var1,var2,var3 |
所有受访者都可以看到所有 3 个项目。但有些受访者没有完成。
现在我想将每个可以看到项目但没有看到的受访者的值更改为 -77。
数据框应如下所示:
| var1 | var2 | var3 | vars_seen |
|---|---|---|---|
| -99 | -77 | -77 | var1 |
| 1 | -77 | -77 | var1 |
| 1 | 1 | -77 | var1,var2 |
| -99 | 1 | -77 | var1,var2 |
| 1 | -99 | 1 | var1,var2,var3 |
| 1 | 1 | 1 | var1,var2,var3 |
如您所见,还剩下一些 -99。所以我不能只用 -77 替换 -99。
到目前为止我尝试了什么:
# create a vector with all items that could have been seen
vars <- c("var1","var2","var3")
# split the comma-separated string to a vector
df$vars_seen.vec <- stringr::str_split(df$vars_seen,",")
# create a function that applies a setdiff on each row
notseen <- function(vars_seen,vars){
setdiff(vars, vars_seen)
}
# apply the function
df$vars_notseen.vec <- sapply(df$vars_seen.vec, notseen, vars)
现在我们有一列包含受访者没有看到的所有项目。但是我不知道如何根据它来设置变量。
【问题讨论】:
-
我不完全理解,为什么不使用指标变量和变量分数。例如。 df
标签: r