[英]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)
如果您有很多列需要平均并且不想将它们全部输入,您可以使用grep
将data
名称与任何模式匹配。 例如,假设您想对名称中包含“R”的所有行求平均值:
data$Average <- rowMeans(data[,grep("R",names(data))], na.rm=TRUE)
只是为了完成所有以前的答案,如果您有多个名为R1
、 R2
、 .... 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.