2016-10-26 16 views
0

我有人员级别的数据,并希望创建一个新的变量,其中包含一个家庭中的孩子数量。我为孩子们创建了一个虚拟变量(如果年龄为<,则为1,否则为0)。我目前正在使用聚合函数,其中HH_ID是家庭标识符。聚合函数的替代方法,不崩溃df

No_kids <- aggregate(child ~ HH_ID, data = df, sum) 

此代码有效,但数据框崩溃,而我想为该家庭的每个观察分配孩子的数量。是否有一个替代集合函数不会折叠数据集?

+5

看看'ave'并阅读[mcve]关于如何在SO上提出问题。 –

+0

如果您将No_kids数据框与您的原始数据帧合并,基于'HH_ID',是不是会得到您想要的? –

回答

0

另外,您可以在聚合后做一个merge(所以在R中):

ag <- aggregate(child ~ HH_ID, data = df, sum) 
setNames(merge(df, ag, by="HH_ID"), c("HH_ID", "child", "No_kids")) 
+0

计算不是最优雅的一段代码,而是适应你的建议工作:ag < - 聚合(孩子〜HH_ID,数据= df,总和) test < - merge(df,ag,by =“HH_ID”) df $ No_kids < - test $ child.y – ClaireS

1

另一个选择是dplyr当然

library(dplyr) 
> player_df = data.frame(team = c('ARI', 'BAL', 'BAL', 'CLE', 'CLE'), 
+      player =c('A', 'B', 'C', 'D', 'F'), 
+      '1' = floor(runif(5, min=1, max=2)*10), 
+      '2' = floor(runif(5, min=1, max=2)*10)) 

的...然后用GROUP_BY和变异从dplyr

player_df %>% group_by(team) %>% mutate(count = n()) 

Source: local data frame [5 x 5] 
Groups: team [3] 

    team player X1 X2 count 
    <fctr> <fctr> <dbl> <dbl> <int> 
1 ARI  A 12 12  1 
2 BAL  B 10 12  2 
3 BAL  C 14 12  2 
4 CLE  D 10 14  2 
5 CLE  F 18 17  2 
+0

唉,只是第二太慢:) –

+0

你应该小心使用n(),因为OP在它们的HH_ID组中都有零和1,它们都将被n() –

0

使用dplyr包:

# Create sample data 
set.seed(3252) 

df <- data.frame(
    HH_ID = sample(1:10, 50, replace = TRUE), 
    child = sample(0:1, 50, replace = TRUE) 
) 

# Count number of children 
df %>% 
    group_by(HH_ID) %>% 
    mutate(child_count = sum(child)) %>% 
    ungroup()