Select 基于 R 中两列条件的所有行(每行多个案例)
Select all rows based on conditions in two columns in R (multiple cases per row)
好的,我是初学者,在充分表述我的问题时遇到问题,所以如果我能在其他地方找到答案请重定向我并原谅我:)
我正在处理一个混乱的大数据患者文件(> 4000 万行)。每个患者 (id) 都有几行。每行(大致)代表一次咨询 symptom/disease 代码 (icpc)。我想将数据集减少到他们 consultations/rows 之一中具有特定条件 (icpc) 的所有患者行,但也为这些患者保留所有具有其他条件的行。我还想保留 reg.date.
列
我的原始 data.frame (x) 看起来像这样(这是捏造的数据,我的数据集中的 id 更长,我遗漏了我想删除的不相关的列):
id icpc reg.date
123 D95 19JUN2015
123 F85 15AUG2016
332 A01 16MAR2010
332 A04 20JAN2018
332 K20 20FEB2017
100 B10 01JUN2017
100 A04 11JAN2008
113 T08 18MAR2018
113 P28 19JAN2017
113 D95 16JAN2013
113 A01 01MAY2009
551 B12 03APR2011
551 D95 09MAY2015
假设我只想在数据集中保留 D95 and/or A01 的患者。我管理了子集:
subset(x, ICPC == c("D95", "A01"))
但这只剩下 D95 和 A01 注册的咨询:
id icpc reg.date
123 D95 19JUN2015
332 A01 16MAR2010
113 D95 16JAN2013
113 A01 01MAY2009
551 D95 09MAY2015
这是我想要的data.frame:
id icpc reg.date
123 D95 19JUN2015
123 F85 15AUG2016
332 A01 16MAR2010
332 A04 20JAN2018
332 K20 20FEB2017
113 T08 18MAR2018
113 P28 19JAN2017
113 D95 16JAN2013
113 A01 01MAY2009
551 B12 03APR2011
551 D95 09MAY2015
如有任何帮助,我们将不胜感激。谢谢!
使用 base
,因为您指定了 subset
df_2 <- by(df, df$id, function(x) subset(x, any(x$icpc %in% c("D95", "A01"))))
df_2 <- do.call(rbind, lapply(df_2, data.frame))
row.names(df_2) <- NULL
id icpc reg.date
1 113 T08 18MAR2018
2 113 P28 19JAN2017
3 113 D95 16JAN2013
4 113 A01 01MAY2009
5 123 D95 19JUN2015
6 123 F85 15AUG2016
7 332 A01 16MAR2010
8 332 A04 20JAN2018
9 332 K20 20FEB2017
10 551 B12 03APR2011
11 551 D95 09MAY2015
使用 dplyr
- 我认为更容易,但使用 filter
而不是 subset
library(dplyr)
df %>%
group_by(id) %>%
filter(any(icpc %in% c("D95", "A01")))
id icpc reg.date
<dbl> <chr> <chr>
1 123 D95 19JUN2015
2 123 F85 15AUG2016
3 332 A01 16MAR2010
4 332 A04 20JAN2018
5 332 K20 20FEB2017
6 113 T08 18MAR2018
7 113 P28 19JAN2017
8 113 D95 16JAN2013
9 113 A01 01MAY2009
10 551 B12 03APR2011
11 551 D95 09MAY2015
好的,我是初学者,在充分表述我的问题时遇到问题,所以如果我能在其他地方找到答案请重定向我并原谅我:)
我正在处理一个混乱的大数据患者文件(> 4000 万行)。每个患者 (id) 都有几行。每行(大致)代表一次咨询 symptom/disease 代码 (icpc)。我想将数据集减少到他们 consultations/rows 之一中具有特定条件 (icpc) 的所有患者行,但也为这些患者保留所有具有其他条件的行。我还想保留 reg.date.
列我的原始 data.frame (x) 看起来像这样(这是捏造的数据,我的数据集中的 id 更长,我遗漏了我想删除的不相关的列):
id icpc reg.date
123 D95 19JUN2015
123 F85 15AUG2016
332 A01 16MAR2010
332 A04 20JAN2018
332 K20 20FEB2017
100 B10 01JUN2017
100 A04 11JAN2008
113 T08 18MAR2018
113 P28 19JAN2017
113 D95 16JAN2013
113 A01 01MAY2009
551 B12 03APR2011
551 D95 09MAY2015
假设我只想在数据集中保留 D95 and/or A01 的患者。我管理了子集:
subset(x, ICPC == c("D95", "A01"))
但这只剩下 D95 和 A01 注册的咨询:
id icpc reg.date
123 D95 19JUN2015
332 A01 16MAR2010
113 D95 16JAN2013
113 A01 01MAY2009
551 D95 09MAY2015
这是我想要的data.frame:
id icpc reg.date
123 D95 19JUN2015
123 F85 15AUG2016
332 A01 16MAR2010
332 A04 20JAN2018
332 K20 20FEB2017
113 T08 18MAR2018
113 P28 19JAN2017
113 D95 16JAN2013
113 A01 01MAY2009
551 B12 03APR2011
551 D95 09MAY2015
如有任何帮助,我们将不胜感激。谢谢!
使用 base
,因为您指定了 subset
df_2 <- by(df, df$id, function(x) subset(x, any(x$icpc %in% c("D95", "A01"))))
df_2 <- do.call(rbind, lapply(df_2, data.frame))
row.names(df_2) <- NULL
id icpc reg.date
1 113 T08 18MAR2018
2 113 P28 19JAN2017
3 113 D95 16JAN2013
4 113 A01 01MAY2009
5 123 D95 19JUN2015
6 123 F85 15AUG2016
7 332 A01 16MAR2010
8 332 A04 20JAN2018
9 332 K20 20FEB2017
10 551 B12 03APR2011
11 551 D95 09MAY2015
使用 dplyr
- 我认为更容易,但使用 filter
而不是 subset
library(dplyr)
df %>%
group_by(id) %>%
filter(any(icpc %in% c("D95", "A01")))
id icpc reg.date
<dbl> <chr> <chr>
1 123 D95 19JUN2015
2 123 F85 15AUG2016
3 332 A01 16MAR2010
4 332 A04 20JAN2018
5 332 K20 20FEB2017
6 113 T08 18MAR2018
7 113 P28 19JAN2017
8 113 D95 16JAN2013
9 113 A01 01MAY2009
10 551 B12 03APR2011
11 551 D95 09MAY2015