2017-05-27 2 views
-1

に結果を格納、私は次のdf作成しました:私のタスク1列に同じ値に基づいてループして私の問題を説明するために、新たなデータフレーム

hh_01 <- c(rep(1:4, each = 3), rep(5:10, each = 5)) 
vill <- c(rep(100, 12), rep(101, 30)) 
hh_02 <- c(2:4, 1, 3, 4, 1:2, 4, 1:3, 6:10, 5, 7:10, 5:6, 8:10, 5:7, 9:10, 5:8, 10, 5:9) 
set.seed(1); dist <- abs(rnorm(42, mean = 0, sd = 1000)) 
df <- matrix(c(hh_01, vill, hh_02, dist), nrow = 42, ncol = 4) 
colnames(df) <- c("hh_01", "vill", "hh_02", "dist") 
df <- as.data.frame(df) 
df 
    hh_01 vill hh_02  dist 
1  1 100  2 1728.39791 
2  1 100  3 979.05280 
3  1 100  4 972.09301 
4  2 100  1 461.72457 
5  2 100  3 384.84236 
6  2 100  4 523.10665 
7  3 100  1 482.88891 
8  3 100  2 218.27501 
9  3 100  4 878.32424 
10  4 100  1 41.75679 
11  4 100  2 967.72103 
12  4 100  3 661.80881 
13  5 101  6 851.74364 
14  5 101  7 852.48595 
15  5 101  8 471.51824 
16  5 101  9 862.90742 
17  5 101 10 750.57410 
18  6 101  5 1714.03797 
19  6 101  7 93.43975 
20  6 101  8 640.15912 
21  6 101  9 601.66437 
22  6 101 10 969.44271 
23  7 101  5 77.95871 
24  7 101  6 604.71114 
25  7 101  8 169.18386 
26  7 101  9 435.42663 
27  7 101 10 604.22278 
28  8 101  5 475.18935 
29  8 101  6 13.09895 
30  8 101  7 2873.04565 
31  8 101  9 1019.03810 
32  8 101 10 41.51445 
33  9 101  5 914.63453 
34  9 101  6 67.62432 
35  9 101  7 85.45653 
36  9 101  8 971.21044 
37  9 101 10 2074.87280 
38 10 101  5 98.43913 
39 10 101  6 437.63773 
40 10 101  7 620.47573 
41 10 101  8 376.56226 
42 10 101  9 1013.93106 

を:同じ値を持つすべてのhh_01を計算するためにDISTの平均、以下の構造を持つ新しいDFに結果を保存します。

hh_01 vill mean_dist 
1  100 1226.515 
2  100 ....... 

は私が(多分、または代わりにsapply/lapplyまたは)forループを使用する必要があります知っているが、私は、このコマンドを終了する方法を知っているドント...

私は、これらは(だけでなく、Rでの)プログラミングでの基本を知っている
for (i in seq(along=df[,df$hh_01])){ 
    ifelse(df$hh_01[i] == df$hh_01[i+1]) 
} 

が、この分野ではないプログラマとかなり新しいの - 私...) 私は任意の助けをいただければ幸いです。 コードがシンプルになればなるほど、私にとってはより良いものになります(簡単な説明をお願いします)。私はこの種のループ(または一般的なループ)を理解したいと思っています。なぜなら、この種の質問を将来頻繁に処理しなければならないからです。 ありがとうございます。

+0

あなたがサンプルデータを提供することをいいますが、それが基づいて値のランダム生成のため、常に変化と。一定の結果を提供するには、 'set.seed = 1234'のようなものを使用してください。 – epi99

+0

が変更されました。あなたのメモに感謝します。 – Mapos

答えて

0

ここにはdplyrパッケージを使用したバージョンがありますが、私はあなたとは異なる結果を得ています。 Rの重要な特徴の1つは、多くの関数がforまたはapply構造(forまたはapplyは関数内に隠されています)を使用することなく、全体の構造に対して操作できることを意味するvectorizedです。データフレームを作成する簡単な方法にも注意してください。

set.seed = 123 
df <- data.frame(
    hh_01 = c(rep(1:4, each = 3), rep(5:10, each = 5)), 
    vill = c(rep(100, 12), rep(101, 30)), 
    hh_02 = c(2:4, 1, 3, 4, 1:2, 4, 1:3, 6:10, 5, 7:10, 5:6, 8:10, 5:7, 9:10, 5:8, 10, 5:9), 
    dist = abs(rnorm(42, mean = 0, sd = 1000)) 
) 



library(dplyr) 
df2 <- df %>% 
    group_by(hh_01, vill) %>% 
    summarize(mean_dist = mean(dist)) 
df2 

# hh_01 vill mean_dist 
# < int> <dbl>  <dbl> 
# 1  1 100 1265.9534 
# 2  2 100 855.2477 
# 3  3 100 840.0750 
# 4  4 100 876.0722 
# 5  5 101 574.8193 
# 6  6 101 559.2385 
# 7  7 101 1177.1751 
# 8  8 101 765.6921 
# 9  9 101 438.8936 
# 10 10 101 331.3354 
0

dplyrパッケージは大きな助けになります。

library(dplyr) 

new_df <- group_by(df, hh_01, vill) 
new_df <- summarize(new_df, mean_dist=mean(dist)) 

出力例:

hh_01 vill mean_dist 
    <dbl> <dbl>  <dbl> 
1  1 100 666.0538 
2  2 100 720.5532 

偉大dplyrチートシートがここに発見された:http://nbviewer.jupyter.org/github/rstudio/cheatsheets/blob/master/source/pdfs/data-transformation-cheatsheet.pdf

summarizeはベクトル化機能ですが - summarizeあなたのための効率的なループの世話をします。

1

またaggregateを使用することができます。再現性がないので、

dfnew<-aggregate(df[c("hh_01","vill","dist")],by=list(df$hh_01),mean)[-1] 
関連する問題