2017-04-03 11 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)の平均を見つけるしたいと思います。つまり、私はそこに2つの未満用語であると私は平均的に使用される用語の数が含まれている4番目の列をさらに追加した時はいつでも、それはNAを言う - カラム平均

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 

を得ることに興味を持っています。

これはかなりの操作であり、当然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

名=の平均は、 '' 年= 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には2つの新しい列が必要です。平均と長さは同じように見えます。 – Frank