2017-04-03 108 views
0

我的数据集有以下形式计算数据帧矢量

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 

平均 -column它说:NA每当有不到2个学期,我已经中再加入含有在平均使用的项数第四列。

这是相当多的操作,他们自然可以在for -loop中完成。但是专业的R是如何解决这个问题的?


数据

与data.table
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") 
+1

不应该平均名称= 'A' 一年= 2是40? – G5W

+0

您提供的df不是data.frame。 – Frank

回答

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

一种方式:

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

你正在猜测@Frank。有时我会忘记它有多简单。谢谢! – LyzandeR

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 
+0

OP想要两个新的列:平均值以及长度,看起来像。 – Frank