【问题标题】:How to subset dataframe based on multiple variables in R如何根据 R 中的多个变量对数据框进行子集化
【发布时间】:2019-11-01 15:08:54
【问题描述】:

我有一个 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 北美 F3 北美 K17

4 NA NA F3 M87

在基于 F3 的子设置行之后应该是这样的;

行名 Var1 Var2 Var3 Var4

1 F3 NA NA M87

3 北美 F3 北美 K17

4 NA NA F3 M87

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

然后我希望根据它们在该子集中的常见程度列出其他变量(F3 除外),在这种情况下是

最常见:M87

第二常见:K17

如果有帮助,我会尝试识别患有特定疾病的人,然后我会尝试找出这些人最常患有的其他疾病

感谢您的帮助

【问题讨论】:

标签: r dataframe subset


【解决方案1】:

如果您想使用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_longer 和count 之后:

# 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")))

【讨论】:

  • 谢谢!这正是我一直在寻找的,它完美地工作
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2022-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多