[英]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.