如何基于R中的多个变量对数据帧进行子集

时间:2019-11-01 15:08:54

标签: r dataframe subset

我有一个286列和157355行的数据框。我希望对包含几个定义的因子变量(例如F32,F341等)中的一个或多个的行进行子集化。 完成此操作后,我希望确定子集行中最常见的其他因子变量。

我尝试过滤感兴趣的值,但是出现一条错误消息,例如,数据必须是数字,逻辑或复杂的;

d<- a %>%
  filter_at(vars(f.41202.0.0:f.41202.0.65), all_vars('F32'))

我也尝试过此操作,但是结果数据框不存在任何值;

f <- a %>%
  rowwise() %>%
  filter(any(c(1:280) %in% c('F32', 'F320', 'F321', 'F322', 'F323', 
                             'F328', 'F329', 'F330', 'F331', 'F332', 
                             'F333', 'F334', 'F338', 'F339')))

当我尝试将所有相关变量放入ICD对象时,也会发生同样的情况

f <- b %>%
  rowwise() %>%
  filter(any(c(1:286) %in% ICD))

非常感谢您提出任何建议

我的数据看起来像这样(对不起,我在此页面上找不到更好的格式化方式);

行名Var1 Var2 Var3 Var4

1 F3 NA NA M87

2不适用不适用M87不适用

3 NA F3 NA K17

4 NA NA F3 M87

在基于F3的行设置之后,应该看起来像这样;

行名Var1 Var2 Var3 Var4

1 F3 NA NA M87

3 NA F3 NA K17

4 NA NA F3 M87

因此保留了相同的可变列,但删除了没有F3的行

然后我希望根据它们在子集中的普遍程度列出其他变量(F3除外),

最常见的:M87

第二个最常见的:K17

如果有帮助,我正在尝试识别患有某种疾病的人,然后我将尝试找出这些人最常患有哪些其他疾病

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

如果您想使用tidyverse,则可以使用filter_all查看所有列。然后,检查any_vars是否在诊断代码的向量中。在我的示例中,我查看了F3和F320。

此后,如果您想累加诊断代码的数量,可以将数据从宽到长整形,然后计算频率。如果需要,可以按过滤器删除NA。让我知道您是否打算这样做。

df <- data.frame(
  Var1 = c("F3", NA, NA, NA),
  Var2 = c(NA, NA, "F3", NA),
  Var3 = c(NA, "M87", NA, "F3"),
  Var4 = c("M87", NA, "K17", "M87")
)

library(tidyverse)

df %>%
  filter_all(any_vars(. %in% c("F3", "F320"))) %>%
  pivot_longer(cols = starts_with("Var"), names_to = "Var", values_to = "Code") %>%
  filter(!is.na(Code)) %>%
  count(Code, sort = TRUE)

在过滤器之后,您应该具有:

  Var1 Var2 Var3 Var4
1   F3 <NA> <NA>  M87
2 <NA>   F3 <NA>  K17
3 <NA> <NA>   F3  M87

pivot_longercount之后:

# A tibble: 3 x 2
  Code      n
  <fct> <int>
1 F3        3
2 M87       2
3 K17       1

侧面说明:如果您希望仅基于部分变量进行过滤(而不是选择所有变量),则可以改用filter_at,例如:

filter_at(vars(starts_with("Var")), any_vars(. %in% c("F3", "F320")))