【问题标题】:Filter R data set by value but keep rows that come from the same record number按值过滤 R 数据集,但保留来自相同记录号的行
【发布时间】:2025-12-27 04:25:12
【问题描述】:

我的调查结果经过整理,每一行都是一个调查问题。这意味着一个人的调查回复可能会占用 8 行。我想保留在以下问题上得分为 0 或 1 的人的所有回答:“提供者会推荐”或“设施会推荐”。我知道如何过滤这些分数,但不是以保留这些记录的所有其他行的方式。编写此代码的最佳方法是什么。

【问题讨论】:

  • 请不要发布代码/数据/错误的图像:它不能被复制或搜索 (SEO),它会破坏屏幕阅读器,并且它可能不适合某些移动设备。参考:meta.*.com/a/285557/3358272(和xkcd.com/2116)。请直接包含代码或数据(例如,dput(head(x))data.frame(...))。

标签: r if-statement filter


【解决方案1】:

Tidyverse 解决方案:

library(dplyr)
dat %>%
  group_by(record) %>%
  filter(any(question == 'provider' & value %in% 0:1)) %>%
  ungroup()
# # A tibble: 3 x 3
#   record question      value
#    <int> <fct>         <int>
# 1  26544 provider          1
# 2  26544 confidence        4
# 3  26544 communication     3

dat %>%
  filter(question == 'provider' & value %in% 0:1) %>%
  select(record) %>%
  left_join(dat, by = "record")
# Joining, by = "record"
#   record      question value
# 1  26544      provider     1
# 2  26544    confidence     4
# 3  26544 communication     3

数据表:

(注意:我在这里使用magrittr::%&gt;%,通常在上面加载dplyr,仅用于演示。我喜欢类似管道的命令流,但不难适应非magrittr流。)

library(data.table)
library(magrittr)
datDT[, .SD[ any(question == 'provider' & value %in% 0:1), ], by = "record" ]
#    record      question value
# 1:  26544      provider     1
# 2:  26544    confidence     4
# 3:  26544 communication     3

datDT[ question == 'provider' & value %in% 0:1, .(record) ] %>%
  datDT[., on = "record" ]
#    record      question value
# 1:  26544      provider     1
# 2:  26544    confidence     4
# 3:  26544 communication     3

数据

dat <- data.frame(
  record = c(26544L, 26544L, 26544L, 655445L, 655445L, 655445L),
  question = rep(c("provider", "confidence", "communication"), times = 2),
  value = c(1L, 4L, 3L, 9L, 1L, 4L)
)

【讨论】:

  • 当我使用这段代码时,它包含了应该被过滤掉的值,例如“提供者会推荐”,值为 10
  • 我无法重现该行为。如果我用dat$value[4] &lt;- 10L 更改源数据,则此代码中没有一个包含结果中的第二条记录。显示此代码失败的示例数据。
  • 我发现了我的错误。感谢您的帮助。
最近更新 更多