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