R:跨列具有指定级别的数值到因式分解

R: Numeric to factor with specified levels across columns

提问人:mindyeti 提问时间:10/10/2023 最后编辑:stefanmindyeti 更新时间:10/10/2023 访问量:45

问:

我有一项调查的数据,李克特分数是在三个时间点进行的。目前以数字形式,我想将所有带有李克特分数数据的列从数字转换为具有指定级别的因子。我不想为每列完成 21 次以下函数,而是在一个块中跨 21 列执行该函数。

data$Pre_S1 <- factor(data$Pre_S1,
  levels = c(1, 2, 3, 4, 5, 6),
  labels = c(
    "Strongly Disagree", "Moderately Disagree",
    "Slightly Disagree", "Slightly Agree",
    "Moderately Agree", "Strongly Agree"
  )
)

我觉得我可能很接近这段代码,但还没有完全掌握它。非常感谢任何意见。

data %>% mutate(across(
  c(
    "Pre_S1", "Pre_S2", "Pre_S3", "Pre_S4", "Pre_S5",
    "Pre_S6", "Pre_S7",
    "Mid_S1", "Mid_S2", "Mid_S3",
    "Mid_S4", "Mid_S5", "Mid_S6", "Mid_S7",
    "Post_S1", "Post_S2", "Post_S3",
    "Post_S4", "Post_S5", "Post_S6", "Post_S7"
  ),
  as.factor(data,
    levels = c(1, 2, 3, 4, 5, 6),
    labels = c(
      "Strongly Disagree", "Moderately Disagree",
      "Slightly Disagree", "Slightly Agree",
      "Moderately Agree", "Strongly Agree"
    )
  )
))

如果有帮助,我可以发布一些数据。TIA。

我尝试用一行代码更改每个值,尽管这是重复的,R似乎不太喜欢它。

r dplyr 分类

评论

0赞 mindyeti 10/10/2023
spc_tbl_ [180 × 25] (S3: spec_tbl_df/tbl_df/tbl/data.frame) $ ID : num [1:180] 1 2 3 4 5 7 8 9 10 11 ... $ 队列 : num [1:180] 1 1 1 1 1 1 1 1 1 1 1 1 ... $ 面积 : num [1:180] 1 2 3 2 7 10 2 4 1 2 ... $ 完成者: num [1:180] 1 2 1 2 2 2 2 2 1 ... $ Pre_S1 : 数字 [1:180] 5 4 5 5 5 5 5 3 4 5 ... $ Pre_S2 : 数字 [1:180] 4 4 4 5 5 4 5 3 4 1 ...

答:

1赞 stefan 10/10/2023 #1

使用一些假示例数据,这里有一种方法可以使你的代码工作,它转换所有以 + 数字结尾的列:_S

library(dplyr, warn=FALSE)

set.seed(123)

data <- tibble(
  ID = 1:10,
  Pre_S1 = sample(1:6, 10, replace = TRUE),
  Pre_S2 = sample(1:6, 10, replace = TRUE),
  Mid_S1 = sample(1:6, 10, replace = TRUE),
  Mid_S2 = sample(1:6, 10, replace = TRUE)
)


data <- data |>
  mutate(
    across(
      matches("_S\\d+$"),
      ~ factor(.x,
        levels = c(1, 2, 3, 4, 5, 6),
        labels = c(
          "Strongly Disagree", "Moderately Disagree",
          "Slightly Disagree", "Slightly Agree",
          "Moderately Agree", "Strongly Agree"
        )
      )
    )
  )

str(data)
#> tibble [10 × 5] (S3: tbl_df/tbl/data.frame)
#>  $ ID    : int [1:10] 1 2 3 4 5 6 7 8 9 10
#>  $ Pre_S1: Factor w/ 6 levels "Strongly Disagree",..: 3 6 3 2 2 6 3 5 4 6
#>  $ Pre_S2: Factor w/ 6 levels "Strongly Disagree",..: 6 1 2 3 5 3 3 1 4 1
#>  $ Mid_S1: Factor w/ 6 levels "Strongly Disagree",..: 1 5 3 2 2 1 6 3 4 6
#>  $ Mid_S2: Factor w/ 6 levels "Strongly Disagree",..: 1 3 5 4 2 5 1 1 2 3
1赞 s_baldur 10/10/2023 #2

基本 R 替代方案:

convert_factor <- function(x) {
  factor(
    x, levels = c(1, 2, 3, 4, 5, 6),
    labels = c(
      "Strongly Disagree", "Moderately Disagree",
      "Slightly Disagree", "Slightly Agree",
      "Moderately Agree", "Strongly Agree"
    )
  )
}
vars       <- c("Pre_S1", "Pre_S2", "Mid_S1", "Mid_S2", ...)
data[vars] <- lapply(data[vars], convert_factor)