问题描述
我有一个李克特量表问题的数据框。所有问题的比例都是1-10,但是要进行一些分析,我想将比例重新编码为1到5。
因此,我想重新编码数据帧中的大多数变量,但不包括识别变量。我已经尝试了几件事,并且也研究了过去的线程,但是找不到解决方案,总是遇到错误。
由于我是R的新手,所以我相信这只是菜鸟的错误,但希望您能为我提供帮助。
代码如下:
z <- data.frame (ID = c(23,24,25,26,27),Project = c("EA","EA","PLA","PLA"),Q1 = c(3,9,8,5,10),Q2 = c(1,2,6,7,9),Q3 = c(4,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,ifelse(x== 5,3),ifelse(x== 6,ifelse(x== 7,4),ifelse(x== 8,ifelse(x== 9,5),ifelse(x== 10,x)))
我收到此错误:
Error in .subset(x,j) : invalid subscript type 'list'
您能发现错误吗? 预先谢谢你!
解决方法
ifelse
需要是和没有条件。因此,您可以将代码更改为:
z[,3:5] <- lapply(z[,3:5],function(x)ifelse(x == 2,1),ifelse(x == 3,2,ifelse(x== 4,ifelse(x== 5,3,ifelse(x== 6,ifelse(x== 7,4,ifelse(x== 8,ifelse(x== 9,5,ifelse(x== 10,x)))))))))
但是,您可以将它们组合为一个并使用%in%
来检查多个值,而不必分别编写每个条件。另外使用dplyr::case_when
可能有助于提高代码的可读性。
z[,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
这里是一线。
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