R 计算数据帧向量的条件平均值
我的数据集具有以下形式R 计算数据帧向量的条件平均值,r,R,我的数据集具有以下形式 Name year val ”a” 1 25 ”a” 1 75 ”a” 2 20 ”a
Name year val
”a” 1 25
”a” 1 75
”a” 2 20
”a” 2 40
”a” 2 60
”a” 3 50
”b” 1 20
”b” 2 10
”b” 2 20
”b” 2 30
”b” 3 40
”b” 3 60
因此,它由名称、年份和值组成。我想找到每个年的值的平均值(val
),并按名称进行分组。也就是说,我有兴趣
Name year average terms in the average
”a” 1 50 2
”a” 2 40 3
”a” 3 NA 1
”b” 1 NA 1
”b” 2 20 3
”b” 3 50 2
在平均值-列中,当术语少于2个时,会显示NA
,我还添加了第四列,其中包含平均值中使用的术语数量
这是相当多的操作,它们自然可以在for
循环中完成。但是,专业的R
方法是什么呢
数据
df = structure(list(name = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"),
year = c(1, 1, 2, 2, 2, 3, 1, 2, 2, 2, 3, 3), val = c(25,
75, 20, 40, 60, 50, 20, 10, 20, 30, 40, 60)), .Names = c("name",
"year", "val"), row.names = c(NA, -12L), class = "data.frame")
data.table的一种方式:
library(data.table)
#group by name and year and calculate average
df2 <- setDT(df)[, list(average = mean(val), terms = .N), by = c('Name', 'year')]
#NA if terms less than 2
df2[terms < 2, average := NA]
data.table的一种方式:
library(data.table)
#group by name and year and calculate average
df2 <- setDT(df)[, list(average = mean(val), terms = .N), by = c('Name', 'year')]
#NA if terms less than 2
df2[terms < 2, average := NA]
dplyr
方式:
库(dplyr)
df%>%
集团单位(名称、年份)%>%
总结(平均值=ifelse(n()<2,NA,平均值(val)),
`平均值为`=n()的术语
#>来源:本地数据帧[6 x 4]
#>组:名称[?]
#>
#>名称年份平均值`平均值中的术语`
#>
#>1“a”150 2
#>2“a”240 3
#>3“a”3 NA 1
#>4“b”1 NA 1
#>5“b”220 3
#>6“b”350 2
dplyr方式:
库(dplyr)
df%>%
集团单位(名称、年份)%>%
总结(平均值=ifelse(n()<2,NA,平均值(val)),
`平均值为`=n()的术语
#>来源:本地数据帧[6 x 4]
#>组:名称[?]
#>
#>名称年份平均值`平均值中的术语`
#>
#>1“a”150 2
#>2“a”240 3
#>3“a”3 NA 1
#>4“b”1 NA 1
#>5“b”220 3
#>6“b”350 2
name='a'year=2的平均值不应该是40吗?您提供的df不是data.frame。name='a'year=2的平均值不应该是40吗?您提供的df不是data.frame。您猜对了@Frank。有时我忘了它有多简单。谢谢弗兰克,你猜对了。有时我忘了它有多简单。谢谢OP需要两个新列:平均值和长度,看起来像。OP需要两个新列:平均值和长度,看起来像。
aggregate(df$val, by = list(df$name, df$year), function(x)
c(mean = mean(x)*NA^(!length(x)>1), n = length(x)))
# Group.1 Group.2 x.mean x.n
#1 a 1 50 2
#2 b 1 NA 1
#3 a 2 40 3
#4 b 2 20 3
#5 a 3 NA 1
#6 b 3 50 2