2017-05-06 74 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)