r - 使用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 语句,而且我对括号的位置很小心,所以我不知道它到底指的是什么。
我不确定是否可以以这种方式遍历数据框,或者这是否有意义。我已经读过矢量化对于高级过滤通常可能更好,但试图阅读它的文档并且无法真正了解如何使这个问题跳转到这个问题。有没有人有我应该寻找的建议或方向?
解决方案
您不需要为此循环。尝试
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))
推荐阅读
- maven - 如果不稳定,请重试 Jenkins Maven 构建?
- azure - 函数应用程序(天蓝色)是否能够访问远程虚拟机中的文件夹?
- google-cloud-composer - 从 Cloud Composer 连接 CloudSQL Postgresql
- c - 调用我调用一个函数来自复位?
- go - 添加元素后通道长度为零
- jquery - 如何修复滚动按钮以始终转到下一部分,除非最后一部分返回顶部
- c# - 如何将字符串或值从 Site.Master.cs 发送到我的 Default.aspx.cs 到标签/文本框中的值/字符串?
- swift - 有没有办法在 SwiftUI 中为 TextField 设置 inputView?
- javascript - Angular 4 AmChart
- python - 通过python selenium chrome单击按钮