如何根据外部向量过滤表的行?

Posted

技术标签:

【中文标题】如何根据外部向量过滤表的行?【英文标题】: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

【问题讨论】:

***.com/questions/3971006/… , ***.com/questions/1269624/… , ***.com/questions/3352670/r-selecting-rows 等等... 【参考方案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")

【讨论】:

以上是关于如何根据外部向量过滤表的行?的主要内容,如果未能解决你的问题,请参考以下文章

R:如何根据向量中存在的名称过滤命名列表?

如何防止从非常量访问指针中过滤指针向量的函数?

根据子字符串的长度过滤一维字符向量

如何将命名向量作为行添加到数据框中,根据列名顺序重新排序?

根据属性过滤数据(data.frame)并将其分配给向量

如何从多个向量中删除相同的行位置?