繁体   English   中英

R中不同长度的平均值

[英]Averages of different lengths in R

我正在尝试计算对不同事件的响应的平均分数。 我的数据是长格式的,每个事件一行,这里是示例数据集data

Subject  Event   R1  R2 R3 R4   Average
1        A       1   2  2  N/A   2.5
1        B       1   1  1  1     1

因此,要获得事件 A 的平均值,忽略 N/A 将是 (R1 + R2 + R3)/3,而事件 B 有 4 个响应。 我计算了dplyr事件 A 的dplyr

data$average <- data%>%filter(Event == "A") %>% with(data, (R1 + R2 + R3)/4) 

当我尝试为下一个活动做同样的事情时遇到了问题......谢谢你的帮助!

以下不包括作为平均值计算的一部分的 NA 值 ( na.rm=TRUE )。 另外,我认为按事件分组很重要。 在没有 group_by 的情况下运行时,计算结合了所有事件,结果值为 1.285714 (=9/7 obs)。

data <- data.frame(
  Subject=c(1,1),
  Event=c('A', 'B'),
  R1=c(1,1),
  R2=c(2,1),
  R3=c(2,1),
  R4=c(NA,1)
)

df <- data %>%
  group_by(Event) %>%
  mutate(Average = mean(c(R1,R2,R3,R4), na.rm=TRUE))

输出:

Subject Event    R1    R2    R3    R4 Average
    <dbl> <fct> <dbl> <dbl> <dbl> <dbl>   <dbl>
1       1 A         1     2     2    NA    1.67
2       1 B         1     1     1     1    1   

您不需要一次过滤每个事件。 dplyr能够一次一一处理所有行。 此外,在使用dplyr ,您不需要分配给其上下文之外的变量,例如data$average <- (something) 您可以使用mutate() 所以dplyr的直观语法是:

data <-
  data %>%
  mutate(average = mean(c(R1, R2, R3, R4), na.rm = TRUE))

您可以使用rowMeans计算数据帧每一行的均值。 在输入中指定要包含的列。 要忽略NA设置na.rm=TRUE

data$Average <- rowMeans(data[,c("R1", "R2", "R3", "R4")], na.rm=TRUE)

如果您有很多列需​​要平均并且不想将它们全部输入,您可以使用grepdata名称与任何模式匹配。 例如,假设您想对名称中包含“R”的所有行求平均值:

data$Average <- rowMeans(data[,grep("R",names(data))], na.rm=TRUE)

只是为了完成所有以前的答案,如果您有多个名为R1R2 、 .... R100 ,而不是将它们全部写入mean函数中,您可能会感兴趣,通过使用pivot_longer函数将数据帧重新整形为更长的格式和然后按事件分组并计算平均值。 最后,使用pivot_wider ,您可以将数据帧设置为初始更宽的格式。

library(dplyr)
library(tidyr)
df %>% mutate_at(vars(contains("R")), as.numeric) %>%
    pivot_longer(cols = starts_with("R"), names_to = "R", values_to = "Values") %>%
    group_by(Event) %>%
    mutate(average = mean(Values, na.rm = TRUE)) %>%
    pivot_wider(names_from = R, values_from = Values)

# A tibble: 2 x 8
# Groups:   Event [2]
  Subject Event Average average    R1    R2    R3    R4
    <int> <chr>   <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl>
1       1 A         2.5    1.67     1     2     2    NA
2       1 B         1      1        1     1     1     1

正如@TTS 所提到的,您计算事件 A 的平均值时有问题。

可重现的例子

structure(list(Subject = c(1L, 1L), Event = c("A", "B"), R1 = c(1L, 
1L), R2 = 2:1, R3 = 2:1, R4 = c("N/A", "1"), Average = c(2.5, 
1)), row.names = c(NA, -2L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x5555743c1310>)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM