如何根据外部向量过滤表的行?
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
我有一个我有兴趣进一步研究的医院载体,即YYY
和UUU
。如何用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)
【讨论】:
如果医院改为yyy1
、yyy2
,这将如何扩展到返回相同的结果,因此不可能完全匹配。
@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")
现在使用dplyr
filter
过滤数据
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")
【讨论】:
以上是关于如何根据外部向量过滤表的行?的主要内容,如果未能解决你的问题,请参考以下文章