部分字符串匹配或分离或拆分上的 R 子集数据帧
R subsetting dataframe on partial string match or separating or split
我正在尝试通过部分字符串匹配对数据帧进行子集化。拆分和比较也可能有效,因为字符串可以被“|”拆分
我相信我在过去的类似案例中使用过 %in% 但它不适用于此。
有什么建议吗?
df <- read.table(text="
col1 cOL2
1 '2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47'
2 '2.16.840.1.113883.10.20.22.4.4 | 2.16.840.1.113883.10.20.22.4.4 | 2.16.840.1.113883.10.20.22.4.64'
3 '2.16.840.1.113883.10.20.22.4.64 | 2.16.840.1.113883.10.20.22.4.78 | 2.16.840.1.113883.10.20.1.47'
4 '2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47'
5 '2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47'
", header=T, stringsAsFactors=FALSE)
df[which(df$cOL2 == 1 & df$cOL2 %in% '2.16.840.1.113883.10.20.22.4.19' ),]
一个 tidyverse 选项。
library(tidyverse)
filter(df, str_detect(cOL2, '2.16.840.1.113883.10.20.22.4.19'))
# col1 cOL2
# 1 1 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
# 2 4 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
# 3 5 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
坚持[]
你可以做以下事情。
library(tidyverse)
df[str_detect(df$cOL2, '2.16.840.1.113883.10.20.22.4.19'),]
使用基础 R 函数,您可以:
subset(df, grepl('2.16.840.1.113883.10.20.22.4.19', cOL2))
col1 cOL2
1 1 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
4 4 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
5 5 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
我正在尝试通过部分字符串匹配对数据帧进行子集化。拆分和比较也可能有效,因为字符串可以被“|”拆分 我相信我在过去的类似案例中使用过 %in% 但它不适用于此。 有什么建议吗?
df <- read.table(text="
col1 cOL2
1 '2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47'
2 '2.16.840.1.113883.10.20.22.4.4 | 2.16.840.1.113883.10.20.22.4.4 | 2.16.840.1.113883.10.20.22.4.64'
3 '2.16.840.1.113883.10.20.22.4.64 | 2.16.840.1.113883.10.20.22.4.78 | 2.16.840.1.113883.10.20.1.47'
4 '2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47'
5 '2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47'
", header=T, stringsAsFactors=FALSE)
df[which(df$cOL2 == 1 & df$cOL2 %in% '2.16.840.1.113883.10.20.22.4.19' ),]
一个 tidyverse 选项。
library(tidyverse)
filter(df, str_detect(cOL2, '2.16.840.1.113883.10.20.22.4.19'))
# col1 cOL2
# 1 1 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
# 2 4 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
# 3 5 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
坚持[]
你可以做以下事情。
library(tidyverse)
df[str_detect(df$cOL2, '2.16.840.1.113883.10.20.22.4.19'),]
使用基础 R 函数,您可以:
subset(df, grepl('2.16.840.1.113883.10.20.22.4.19', cOL2))
col1 cOL2
1 1 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
4 4 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47
5 5 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.22.4.19 | 2.16.840.1.113883.10.20.1.47