2017-05-06 72 views
0

如果我有一個數據幀:使用對循環過濾帶中的R不同的組數據幀

d <- data.frame(
    name = c("n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8", "n9", "n10"), 
    color = c("blue", "blue", "red", "blue", "red", "blue", "blue", "red", "green", "green"), 
weight = c(53, 34, 63, 25, 45, 24, 66, 12, 45, 8), 
    gender = c(1, 0, 0, 0, 1 ,1 ,1 , 0, 1, 0)) 

如何將使用R中的for循環函數來過濾「權重」值是10從每個'顏色'的意思是?所以我會得到所有行的輸出,每個單獨的'顏色'的平均值爲+10。

我知道d[d$weight > mean(d$weight) + (10 + sd(d$weight)), ]會給我適合整個樣本的這個標準的行,但我試圖找到每個'顏色'的值分開,因爲每個'顏色'有不同的SD值。

我試圖用for循環的,這是一個可怕的想法,瞭解R.

+1

嗨,爲什麼,如果你想獲得的平均使用'你例子sd'?爲什麼你需要使用for循環(通常最好避免在'R'中使用)? – hhh

+0

對不起,我遺漏了那部分,我現在已經修好了。 – Monique

回答

3

for循環,但既然你問...

d <- data.frame(
    name = c("n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8", "n9", "n10"), 
    color = c("blue", "blue", "red", "blue", "red", "blue", "blue", "red", "green", "green"), 
    weight = c(53, 34, 63, 25, 45, 24, 66, 12, 45, 8), 
    gender = c(1, 0, 0, 0, 1 ,1 ,1 , 0, 1, 0)) 

d[d$weight > (10 + sd(d$weight)), ] 

for (color in unique(d$color)) { 
    subd <- d[d$color == color, ] 
    print(subd[subd$weight > (10 + sd(subd$weight)), ]) 
} 
1

我@cj同意-yetman這樣做與for循環並不理想。更好的方法是使用dplyr分組功能。喜歡的東西:

library(dplyr) 
d2 <- d %>% 
    group_by(color) %>% 
    mutate(avg_w = mean(weight, na.rm = T)) %>% 
    filter(abs(weight - avg_w) <= 10) 

> d2 
Source: local data frame [2 x 5] 
Groups: color [2] 

    name color weight gender avg_w 
    <fctr> <fctr> <dbl> <dbl> <dbl> 
1  n2 blue  34  0 40.4 
2  n5 red  45  1 40.0 
0

考慮基礎R by功能,不正是因爲你需要:在不同級別數據幀的運行相同的操作,這裏是color值。回報是dataframes的列表,然後可以進行最後一個數據幀運行do.call(rbind, ...)

mean_subsetsdflist <- by(d, d$color, function(i) 
    i[i$weight > (mean(i$weight) + (10 + sd(i$weight))), ]) 

mean_subsetdf <- do.call(rbind, mean_subsetsdflist)