示例数据:
vec <- c(21, 23, 25)
df <- data.frame(lines=c("line_21.1", "line_21.2", "line_25.1", "line_25.2", "line_223.1", "line_223.2"), values=c(1, 3, 4, 2, 2, 2))
df
lines values
line_21.1 1
line_21.2 3
line_25.1 4
line_25.2 2
line_223.1 2
line_223.2 2
我想仅对vec
中包含的df$lines
元素进行子集化。所以这个例子的期望输出是:
vec2
21, 25
我试过了:
vec2 <- sapply(vec, function(x) grep(x, df$lines))
但由于223条目,这导致23被错误地包括在内:
[[1]]
[1] 1, 2
[[2]]
[1] 5 6
[[3]]
[1] 3, 4
有什么建议吗?
答案 0 :(得分:2)
我们可以使用gsub
删除'lines'中的子字符串,然后执行intersect
以获取两者中常见的元素
vec2 <- intersect(gsub(".*_|\\.\\d+", "", df$lines), vec)
vec2
#[1] 21 25
答案 1 :(得分:2)
> num <- gsub(".*_(\\d+).*", "\\1", df$lines)
> vec[vec %in% num]
[1] 21 25
答案 2 :(得分:1)
对vec2计算的小修改。这应该工作
vec2 <- sapply(vec, function(x) grep(paste("_",x,".",sep = ""), df$lines))