2017-05-27 32 views
-1

解釋我的問題,我創建了以下DF:循環基礎上的一列存儲在一個新的數據幀的結果相同的值

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 ....... 

我知道我必須使用for循環(或者交替sapply/lapply或),但我不知道如何完成這個命令...

for (i in seq(along=df[,df$hh_01])){ 
    ifelse(df$hh_01[i] == df$hh_01[i+1]) 
} 

我知道這些都是在編程的基礎知識(不只是在R),但我可不是一個程序員,在這方面的...) 我希望得到任何幫助非常新。 代碼越簡單越好(請簡單說明)。我想了解這種循環(或者一般循環),因爲我將來必須經常處理這類問題。 非常感謝。

+0

好,你提供的樣本數據,但它是基於隨機生成值,所以總是在不斷變化,因此不重複的。使用類似'set.seed = 1234'的東西來提供一個不斷的結果 – epi99

+0

改變。謝謝你的提示。 – Mapos

回答

0

這是一個使用dplyr包的版本 - 雖然我得到了與您不同的結果。 R的重要特徵之一是許多函數是vectorized,它們鬆散地表示它們可以在整個結構上運行而不必使用for或apply結構(for或apply隱藏在函數中)。還要注意創建數據框的簡化方法。

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 
1

您還可以使用aggregate

dfnew<-aggregate(df[c("hh_01","vill","dist")],by=list(df$hh_01),mean)[-1] 
相關問題