首页 > 解决方案 > 在多列中查找/分配平均值

问题描述

我试图给我研究的参与者一个包含 20 个问题的子量表的平均值。我首先使用以下代码将字符串响应(例如“从不(零次)”、“很少(一次或两次”等)转换为 1 到 5 个数字输出:

    dataset.clean1$Q11_22 <- revalue(dataset.clean1$Q11_22 , c("Never (zero occasions)" = "1" , "Rarely (one or two occasions)" = "2", "Multiple times (three or more occasions)" = "3", "Regularly (at least once every 1-3 months)" = "4", "Weekly (at least once a week)" = "5"))

我为每个问题做了 20 次(我知道这可能是最不优雅的方法,但这是我目前所知道的全部)。

现在我试图让每个参与者在 Q11_22 到 Q32_43 的平均值,并让 R 跳过任何空白/空行。我尝试了以下方法(并非所有 20 列都包括在内,因此我可以快速测试它):

    ave.exposure <- dataset.clean1$ave.exposure <- mean(dataset.clean1$Q11_22, dataset.clean1$Q12_23, dataset.clean1$Q13_24, na.rm=TRUE)

我收到以下错误:

警告消息:在 mean.default(dataset.clean1$Q11_22, dataset.clean1$Q12_23, dataset.clean1$Q13_24, :argument is not numeric or logical: 返回 NA

现在我对两件事感到困惑:

  1. " "我是否不需要在步骤 1中放入我试图替换我的字符串的数值(例如。
dataset.clean1$Q11_22 <- revalue(dataset.clean1$Q11_22 , c("Never (zero occasions)" = 1

代替:

dataset.clean1$Q11_22 <- revalue(dataset.clean1$Q11_22 , c("Never (zero occasions)" = "1"`) ? 
  1. 我如何(以一种易于理解的方式,无论多么乏味)找到所有这些列中每个参与者的平均值?

标签: r

解决方案


所以有两个步骤:

  1. 将所有因子列转换为数字(链接

  2. 对数字列求平均值(Q11_22 到 Q32_43)

    # Step 1. I assume that your columns are all together
    library(tidyverse)
    dataset.clean1 <- dataset.clean1 %>%
          mutate_at(vars(Q11_22:Q32_43),
                     function(x) as.numeric(levels(x))[x])
    
     # Step 2. Averaging over the columns
     # I also assume that you have other columns in the dataset 
     # which you do not want to delete
    
     start_col <- which(names(dataset.clean1),"Q11_22")
     end_col <- which(names(dataset.clean1),"Q32_43")
     # Specifying the vector of columns you want to row-average over
     indices = c(start_col:end_col)
     dataset.clean1 <- dataset.clean1 %>%
        mutate(average_of_20qn = apply(.[,indices], 
                MARGIN=1, FUN=mean))
    

推荐阅读