【问题标题】:Issue while recoding multiple variables, error - in .subset(x, j) : invalid subscript type 'list' [closed]重新编码多个变量时出现问题,错误 - 在 .subset(x, j) 中:无效的下标类型“列表”[关闭]
【发布时间】:2020-11-06 08:09:57
【问题描述】:

我有一个李克特量表问卷的数据框。所有问题都有 1-10 的等级,但为了进行一些分析,我想将等级重新编码为 1 到 5。

所以,我想重新编码我的数据框中的大部分变量,不包括标识变量。我尝试了几件事并查看了过去的线程,但我找不到解决方案,我总是收到错误。

由于我是 R 新手,我相信这只是一个菜鸟错误,但我希望你能帮助我。

代码如下:

z <- data.frame (ID = c(23,24,25,26,27),
              Project = c("EA","EA","PLA","PLA","PLA"),
              Q1 = c(3,9,8,5,10),
              Q2 = c(1,2,6,7,9),
              Q3 = c(4,8,6,6,10))

recode_z <- z[,3:5] 

p3[,recode_p3] <- as.data.frame(lapply(p3[, recode_p3], function(x)ifelse(x == 2, 1), 
                                                                   ifelse(x == 3, 2), 
                                                                   ifelse(x== 4, 2),
                                                                   ifelse(x== 5, 3),
                                                                   ifelse(x== 6, 3),
                                                                   ifelse(x== 7, 4),
                                                                   ifelse(x== 8, 4),
                                                                   ifelse(x== 9, 5),
                                                                   ifelse(x== 10, 5,x)))

我收到此错误:

Error in .subset(x, j) : invalid subscript type 'list'

你能找出错误吗? 提前谢谢!

【问题讨论】:

标签: r recode


【解决方案1】:

ifelse 需要是和否条件。因此,您可以将代码更改为:

z[, 3:5] <- lapply(z[, 3:5], function(x)ifelse(x == 2, 1), 
                                       ifelse(x == 3, 2, 
                                       ifelse(x== 4, 2,
                                       ifelse(x== 5, 3,
                                       ifelse(x== 6, 3,
                                       ifelse(x== 7, 4,
                                       ifelse(x== 8, 4,
                                       ifelse(x== 9, 5,
                                       ifelse(x== 10, 5,x)))))))))

但是,您可以将它们组合成一个并使用%in% 检查多个值,而不是单独编写每个条件。同时使用dplyr::case_when 可能有助于提高代码的可读性。

z[,3:5] <- lapply(z[, 3:5], function(x) {
  dplyr::case_when(x == 2 ~ 1, 
                   x %in% 3:4 ~ 2, 
                   x %in% 5:6 ~ 3, 
                   x %in% 7:8 ~ 4, 
                   x %in% 9:10 ~ 5, 
                   TRUE ~ x)
})

【讨论】:

  • 这是一个错字,请考虑投票结束。
【解决方案2】:

注意这些值是 2 到 10 之间的整数,并且

(2:10) %/% 2
#[1] 1 1 2 2 3 3 4 4 5

因此新值由下式给出

(2:10 + 1) %/% 2
#[1] 1 2 2 3 3 4 4 5 5

这里是单线。

recode_z <- 3:5
z[recode_z] <- lapply(z[recode_z], function(x) (x + 1L) %/% 2L)

z
#  ID Project Q1 Q2 Q3
#1 23      EA  2  1  2
#2 24      EA  5  1  4
#3 25     PLA  4  3  3
#4 26     PLA  3  4  3
#5 27     PLA  5  5  5

【讨论】:

  • 这是一个错字,请考虑投票结束。
猜你喜欢
  • 1970-01-01
  • 2017-02-06
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2017-10-05
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多