【问题标题】:replace values based on list of column names根据列名列表替换值
【发布时间】: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


【解决方案1】:

在我发布此问题后的 2 个月零一天内,我一直在努力解决这个问题,我找到了一种解决方法:

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")))

vars <- c("var1","var2","var3")

for (i in vars){
  df[[i]][! df$vars_seen %like% i] <- -77
}

【讨论】:

    【解决方案2】:

    我们可以通过, 拆分“vars_seen”列,并在Map 中执行replacement

    df[1:3] <- do.call(rbind, Map(function(x, y) 
         replace(x, !names(x) %in% y, -77), asplit(df[1:3], 1), 
             strsplit(df$vars_seen, ",")))
    

    -输出

    df
    #  var1 var2 var3      vars_seen
    #1  -99  -77  -77           var1
    #2    1  -77  -77           var1
    #3    1    1  -77      var1,var2
    #4  -99    1  -77      var1,var2
    #5    1  -99    1 var1,var2,var3
    #6    1    1    1 var1,var2,var3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-30
      • 2021-10-04
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2021-09-23
      • 2021-06-08
      相关资源
      最近更新 更多