【问题标题】:finding/assigning average across multiple columns在多列中查找/分配平均值
【发布时间】:2021-02-25 22:26:44
【问题描述】:

我试图在包含 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. 我如何(以一种易于理解的方式,无论多么乏味)找到所有这些列中每个参与者的平均值?

【问题讨论】:

  • 您已使用 revalue 将文本字符串转换为其他文本字符串 - "1"(字符)与 1(数字)不同。你得到一个错误,说你的数据不是数字。如果您正在跨行工作,那么您可以使用rowMeans(dataset[ c("var1","var2") ], na.rm=TRUE) 我认为。请参阅此处以获得更清晰的解释 - stackoverflow.com/questions/22458644/…
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 你好,晚邮。我选择使用类似的解决方案将字符转换为数字 dataset.clean1$Q11_22

标签: r


【解决方案1】:

所以有两个步骤:

  1. 将所有因子列转换为数字 (Link)

  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))
    

【讨论】:

  • Hiya jvargh7,不幸的是我无法正确应用您建议的解决方案,因为我还没有在 r 中这样做的知识,但我非常感谢您的帮助!下次我可以得到面对面的帮助时会再试一次。
猜你喜欢
  • 2018-07-12
  • 1970-01-01
  • 2020-12-24
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 2012-02-20
相关资源
最近更新 更多