2017-01-05 1 views
0

私は、このデータセットに特定の列がIDで平均値を得ることができる機能をまとめ使ってIDどのグループでデータを要約するために、各データセットの列をループに

groupdata <- group_by(mydata, id) 

によって

id = c(1,1,1,2,2,3) 
v1 = c(3,4,5,2,4,5) 
v2 = c(3,1,2,1,4,5) 
v3 = c(2,1,2,3,3,4) 
mydata <- data.frame(id ,v1, v2, v3) 

> mydata 
    id v1 v2 v3 
1 1 3 3 2 
2 1 4 1 1 
3 1 5 2 2 
4 2 2 1 3 
5 2 4 4 3 
6 3 5 5 4 

とグループ化されたデータを持っています:私はやってトリング午前何

summarize(groupdata, mean = mean(v1)) 
# A tibble: 3 × 2 
    id mean 
    <dbl> <dbl> 
1  1  4 
2  2  3 
3  3  5 

は、各列をループし、それらをまとめ

colnames <- names(mydata) 

for(i in colnames){ 
    assign(paste(i,"mean", sep = "_"), summarize(groupdata, mean = mean(i))) 
} 

しかし、私はこの

> v1_mean 
# A tibble: 3 × 2 
    id mean 
    <dbl> <lgl> 
1  1 NA 
2  2 NA 
3  3 NA 

を得た私は、あなたがパラメータとして集計関数に列名を渡すことができないことがわかったループ機能を改善するための任意の提案はありますか?

+0

とステップをスキップすることができます。 'apply(mydata、1、mean) ' –

+0

' apply'はグループ化されていない平均値を返します。私が望むものではありません。 – freefrog

+0

それは残念です。実際の回答で更新されました。 –

答えて

1

申し訳ありませんが、私は誤解しました。これを撃つ。

library(dplyr) 
grouped_mean <- mydata %>% 
    group_by(id) %>% 
    mutate_all(.funs = mean) %>% 
    distinct(.keep_all = TRUE) 

> grouped_mean 
Source: local data frame [3 x 4] 
Groups: id [3] 

    id v1 v2  v3 
    <dbl> <dbl> <dbl> <dbl> 
1  1  4 2.0 1.666667 
2  2  3 2.5 3.000000 
3  3  5 5.0 4.000000 

パー@jdobresコメント、あなたはデータがあまりにも巨大でない場合は、 `apply`を試すことができますsummarise_all

grouped_mean <- mydata %>% 
    group_by(id) %>% 
    summarise_all(.funs = mean) 
> grouped_mean 
# A tibble: 3 × 4 
    id v1 v2  v3 
    <dbl> <dbl> <dbl> <dbl> 
1  1  4 2.0 1.666667 
2  2  3 2.5 3.000000 
3  3  5 5.0 4.000000 
+0

ありがとう、これは私が探しているものです! – freefrog

0

私は@Nickが、その結果apply(mydata, 2, mean)を意味だと思う:

 id  v1  v2  v3 
1.666667 3.833333 2.666667 2.500000 
+0

カラムで操作する場合は、 'sapply'や' lapply'を 'sapply(mydata、mean)'と呼ぶ方が良いでしょう。 – Jaap

関連する問題