如何有条件地删除R中具有相同值的观测值

如何有条件地删除R中具有相同值的观测值,r,subset,R,Subset,我正在尝试使用年龄条件对数据帧进行子集划分。然而,我希望它是有条件的多重观察 数据框架有10个观察值,变量为“家庭id”、“家庭关系”、“年龄”“住户id”是唯一分配给每户的住户编号家庭重组是一个人在家庭中的地位1“表示此人是户主。”2“表示他/她是该家庭的配偶。”“年龄”是指人的年龄 Household_id Household_relation Age 1 2 1 27 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多岁,他们会在家庭id 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中,我们可以使用过滤器来保持拥有任何20多岁成员的组

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
在dplyr中,我们可以使用过滤器来保持拥有任何20多岁成员的组

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

当然,您可以将其转换为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

当然,您可以将其转换为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

太棒了。为什么我没有想到按功能分组!比我快。我有x%group\u ByHousehouse\u id%>%filteranysubstrAge,1,1==2子集设置后,我可以使用“ungroup”命令取消数据分组并进行回归吗?或者在做回归之前我不需要解组吗?@DanielCho我不确定,但我认为如果你直接做回归,应该不会有任何区别。这太棒了。为什么我没有想到按功能分组!比我快。我有x%group\u ByHousehouse\u id%>%filteranysubstrAge,1,1==2子集设置后,我可以使用“ungroup”命令取消数据分组并进行回归吗?或者在进行回归之前我不需要解组吗?@DanielCho我不确定,但我认为如果你直接进行回归,应该不会有任何区别。这也很有效!我不习惯data.table语法,但它确实很好用。这也很好用!我不习惯data.table语法,但它确实工作得很好。