【问题标题】:How to filter a table's row based on an external vector?如何根据外部向量过滤表的行?
【发布时间】:2011-07-31 20:57:33
【问题描述】:

(1) 我在 R 中读取了一个大表,其中包含超过 10000 行和 10 列。

(2) 表格的第 3 列包含医院的名称。其中一些是重复的,甚至更多。

(3) 我有一个医院名称的向量,例如其中10个有待进一步研究。

(4) 你能教我如何提取步骤 1 中所有具有步骤 3 中列出的名称的行吗?

这是我的输入文件的一个简短示例;

Patients Treatment Hospital Response 
1        A         YYY      Good 
2        B         YYY      Dead 
3        A         ZZZ      Good 
4        A         WWW      Good 
5        C         UUU      Dead

我有一个我有兴趣进一步研究的医院载体,即YYYUUU。如何用R生成如下输出表?

Patients Treatment Hospital Response 
1        A         YYY      Good 
2        B         YYY      Dead 
5        C         UUU      Dead

【问题讨论】:

标签: r filter


【解决方案1】:

使用%in% 运算符。

#Sample data
dat <- data.frame(patients = 1:5, treatment = letters[1:5],
  hospital = c("yyy", "yyy", "zzz", "www", "uuu"), response = rnorm(5))

#List of hospitals we want to do further analysis on
goodHosp <- c("yyy", "uuu")

您可以直接索引到您的 data.frame 对象:

dat[dat$hospital %in% goodHosp ,]

或使用子集命令:

subset(dat, hospital %in% goodHosp)

【讨论】:

  • 如果医院改为yyy1yyy2,这将如何扩展到返回相同的结果,因此不可能完全匹配。
  • @baxx 将 %in% 替换为 %like%。例如。 dat[dat$hospital %like% 'yyy'] 将匹配 yyy1,但不匹配 xxx。它旨在用于 data.table,本质上是 base::grepl 的包装器
【解决方案2】:

使用dplyr

设置数据 --- 使用 @Chase 的示例数据。

#Sample data
df <- data.frame(patients = 1:5, treatment = letters[1:5],
  hospital = c("yyy", "yyy", "zzz", "www", "uuu"), response = rnorm(5))

#List of hospitals we want to do further analysis on
goodHosp <- c("yyy", "uuu")

现在使用dplyrfilter过滤数据

library(dplyr)
df %>% filter(hospital %in% goodHosp)

【讨论】:

    【解决方案3】:

    data.table 包中的字符向量使用 %chin% 运算符。字符串的速度要快得多。

    require(data.table)
    setDT(dat)
    # filter
    dat[ hospital %chin% goodHosp ]
    

    数据取自@chase 的回答:

    #Sample data
    dat <- data.frame(patients = 1:5, treatment = letters[1:5],
                      hospital = c("yyy", "yyy", "zzz", "www", "uuu"),
                      response = rnorm(5))
    
    #List of hospitals we want to do further analysis on
    goodHosp <- c("yyy", "uuu")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 2023-02-11
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多