如何在R中使用相同的值有条件地删除观察值

问题描述 投票:1回答:2

我正在尝试按年龄条件对数据框进行子集化。但是我希望它以多次观察为条件。

数据框有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)
r subset
2个回答
3
投票

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))), ]

1
投票

当然,您可以将其转换为“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
© www.soinside.com 2019 - 2024. All rights reserved.