我的数据集具有以下形式
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")
答案 0 :(得分:2)
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]
输出:
Name year average terms
1: a 1 50 2
2: a 2 40 3
3: a 3 NA 1
4: b 1 NA 1
5: b 2 20 3
6: b 3 50 2
答案 1 :(得分:2)
dplyr
方式:
library(dplyr)
df %>%
group_by(name, year) %>%
summarize(average = ifelse(n() < 2, NA, mean(val)),
`terms in the average` = n())
#> Source: local data frame [6 x 4]
#> Groups: name [?]
#>
#> Name year average `terms in the average`
#> <fctr> <int> <dbl> <int>
#> 1 ”a” 1 50 2
#> 2 ”a” 2 40 3
#> 3 ”a” 3 NA 1
#> 4 ”b” 1 NA 1
#> 5 ”b” 2 20 3
#> 6 ”b” 3 50 2
答案 2 :(得分:1)
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