首页 > 解决方案 > 使用for循环过滤R中的数据框

问题描述

我是 R 新手,在使用更高级的过滤时遇到了困难。我有一个包含 1500 行家庭成员的数据框,需要过滤掉至少有 1 人超过 24 岁的家庭成员。例如,在下面的样本集中,我只想保留第 3 行,4 和 5。

PersonalID     DOB         HouseholdID
1            1961-04-15      123
2            2017-01-12      123
3            2000-01-02      122
4            2001-03-05      122
5            1996-08-22      122

最初,我只是过滤以获得该年龄范围内每个人的新数据框,然后再次过滤原始数据框(一次又一次,依此类推......)与 25 岁以下的人的每个 HouseholdID 一起检查是否有其他人HouseholdID 超过 24 岁。

每当我一遍又一遍地做同样的事情时,似乎可能有一种方法可以使用函数,但我很难想出一个可行的方法。这是我目前的尝试,但我知道它有很多问题:

UNDER25df <- filter(df, DOB >= "yyyy-mm-dd")

for (UNDER25df$HouseholdID in df) {
    if (all(df$DOB >= "yyyy-mm-dd")) {
       view(filter(df, HouseholdID == "$HouseholdID"))
     }
 }

我得到的错误是:

“}”中意外的“}”

但我很确定我可以在 R 的 for 循环中嵌套一个 if 语句,而且我对括号的位置很小心,所以我不知道它到底指的是什么。

我不确定是否可以以这种方式遍历数据框,或者这是否有意义。我已经读过矢量化对于高级过滤通常可能更好,但试图阅读它的文档并且无法真正了解如何使这个问题跳转到这个问题。有没有人有我应该寻找的建议或方向?

标签: rdataframe

解决方案


您不需要为此循环。尝试

library(lubridate)
library(dplyr)

set.seed(1)
df <- tibble(DOB = Sys.Date() - sample(3000:12000, 6), 
             personalID = 1:6,
             HouseholdID = c(1,1,2,2,2,3))
df$DOB

# grab householdID from all persons that are at least 24
oldies <- df[(lubridate::today() - lubridate::ymd(df$DOB)) > years(24),
             "HouseholdID", TRUE]

# base R way
oldies <- df[as.Date(df$DOB) > as.Date("1993-2-10"),
             "HouseholdID", TRUE]

# household members in a household with someone 24 or older
df %>% 
  filter(HouseholdID %in% oldies)


# household members in a household with noone 24 or older
df %>% 
  filter(!(HouseholdID %in% oldies))

推荐阅读