重新编码多个变量时出现问题,错误 - 在 .subset(x, j) 中:无效的下标类型 'list'
Issue while recoding multiple variables, error - in .subset(x, j) : invalid subscript type 'list'
我有一个李克特量表问卷的数据框。所有的问题都有 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'
你能找出错误吗?
提前致谢!
ifelse
需要 yes 和 no 条件。因此,您可以将代码更改为:
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 到 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
这里是 one-liner.
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
我有一个李克特量表问卷的数据框。所有的问题都有 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'
你能找出错误吗? 提前致谢!
ifelse
需要 yes 和 no 条件。因此,您可以将代码更改为:
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 到 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
这里是 one-liner.
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