我正在尝试按年龄条件对数据框进行子集化。但是我希望它以多次观察为条件。
数据框有10个观察结果,变量为“家庭id”,“家庭关系”,“年龄”。 “家庭ID”是唯一分配给每个房屋的家庭编号。 “家庭教育”是一个人在家庭中的位置。 '1'表示该人是户主。 '2'表示他/她是该家庭的配偶。 '年龄'是这个人的年龄。
Household_id Household_relation Age
1 2 1 27
2 2 2 34
3 4 1 22
4 4 2 23
5 7 2 21
6 7 1 29
7 9 1 33
8 9 2 34
9 11 1 31
10 11 2 29
因此数据由每个家庭的夫妇组成。我想放弃两个都不是20岁的夫妻。因此,如果他们中的一个人在20多岁,他们就会留下来(因此住在家里2)。但如果他们都不是20多岁,我想从数据中删除它们(例如,应该删除家庭ID 9)。因此,子集化过程应该以每次两次观察为条件。
由于我的真实数据有超过10000个观测值,因此语法应足够短以对所有数据进行子集化。我尝试使用'for'循环来做这个,但无法弄清楚如何。
我怎样才能在R中执行此过程?
下面是我可重复的示例代码。
Household_id <- c(2,2,4,4,7,7,9,9,11,11)
Household_relation <- c(1,2,1,2,2,1,1,2,1,2)
Age <- c(27,34,22,23,21,29,33,34,31,29)
data <- data.frame(Household_id, Household_relation, Age)
在dplyr
,我们可以使用filter
来保持20岁以上成员的any
群体。
library(dplyr)
data %>%
group_by(Household_id) %>%
filter(any(Age >= 20 & Age < 30))
# Household_id Household_relation Age
# <dbl> <dbl> <dbl>
#1 2 1 27
#2 2 2 34
#3 4 1 22
#4 4 2 23
#5 7 2 21
#6 7 1 29
#7 11 1 31
#8 11 2 29
与ave
相当的基数R将是
data[as.logical(ave(data$Age, data$Household_id, FUN = function(x)
any(x >= 20 & x < 30))), ]
当然,您可以将其转换为“data.table”,如:
library(data.table)
as.data.table(data)[, .SD[any(Age >= 20 & Age < 30)], Household_id]
# Household_id Household_relation Age
# 1: 2 1 27
# 2: 2 2 34
# 3: 4 1 22
# 4: 4 2 23
# 5: 7 2 21
# 6: 7 1 29
# 7: 11 1 31
# 8: 11 2 29