我有重复的随机人的种族数据行,其中包含指定种族的日期。基于这些条件,我只想为每个人分配一个种族类别(白人、亚裔、黑人、其他人、混血(:(1(如果一个人有多个种族,那么将分配最常见的一个(最高种族_n(。(2( 如果患者具有相同数量的多个种族(例如,1个混血、1个亚洲人、1个其他人(,则将分配最近的一个。我以一种方式组织我的数据,这样我就可以统计每个患者的每个种族,并编写代码,按降序排列种族日期。然而,当我运行代码来获得组织表的第一行时,我最终会为每个人随机分配种族。
人 | 种族 | 种族日期 | ||
---|---|---|---|---|
1 | 白色 | 2019年9月4日 | ||
1 | 白色 | 2018年9月4日 | ||
1 | 白色 | 42017年9月4日[/tr>|||
1 | 白色 | 42016年9月4日 | ||
1 | 其他 | 1 | 2015年9月4日 | |
2 | 亚洲 | 1 | 2019年9月4日||
2 | 其他 | 12018年9月4日|||
2 | 混合 | 12017年9月4日|||
3 | 黑色 | 2 | 2016年9月4日||
3 | 黑色 | 2 | 2015年9月4日
您的主要问题是ethnicity_date
是一个字符向量,而不是Date
。
我假设它是月-月-年格式,但如果是日-月-月格式,你可以将format = "%m/%d/%Y"
更改为format = "%d/%m/%Y"
。
请注意,由于我们对ethnicity_date
和ethnicity_n
使用max()
函数,因此没有必要先按顺序arrange()
数据。如果任一列中都有NA
值,则需要向max()
函数提供na.rm=TRUE
。
df |>
mutate(
ethnicity_date = as.Date(
ethnicity_date,
format = "%m/%d/%Y"
)
) |>
group_by(person) |>
filter(
ethnicity_n == max(ethnicity_n)
) |>
filter(
ethnicity_date == max(ethnicity_date)
) |>
slice(1L) # in case there are still ties
# # A tibble: 3 x 4
# # Groups: person [3]
# person ethnicity ethnicity_n ethnicity_date
# <int> <chr> <int> <date>
# 1 1 white 4 2019-04-09
# 2 2 asian 1 2019-04-09
# 3 3 black 2 2016-04-09
我把你的slice(1L)
放在最后,以防有一个人有多行具有相同的ethnicity_n
和ethnicity_date
,但如果你想在这种情况下保留这两行,你可以删除它。
EDIT:感谢您添加一个示例数据集,这要容易得多。
我认为slice_max()
正是您想要的,请参阅下文。最好先正确格式化日期
library(dplyr)
df %>%
mutate(ethnicity_date = as.Date(ethnicity_date, format = "%d/%m/%Y")) %>%
group_by(person) %>%
slice_max(ethnicity_n) %>%
slice_max(ethnicity_date) %>%
ungroup()
# A tibble: 3 × 4
# person ethnicity ethnicity_n ethnicity_date
# <int> <chr> <int> <date>
# 1 1 white 4 2019-09-04
# 2 2 asian 1 2019-09-04
# 3 3 black 2 2016-09-04