我现在一直在使用R,但发现自己一遍又一遍地使用这些东西。我想必须有一个比写作更简单的方法:
filtered <- names(table(col))[!match.something(names(table(col)))]
match.something返回T / F列表。
当然,我可以做以下事情,使其更简洁,并删除一些重复:
x <- names(table(col))
filtered <- x[!match.something(x)]
但是仍然觉得应该有一种不同/更简单的选择方式。类似子集(x,fun)的东西,以避免两次输入“x”。我在寻找哪种功能?
示例:
> col <- c("AA", "AA", "GG", "GG", "AA", "AG")
> x <- names(table(col))
> x[match.bases(x)]
[1] "AA" "GG"
这是我现在正在使用的功能:
BASES = c("AA", "GG", "CC", "TT")
match.bases <- function(df) {
df %in% BASES
}
答案 0 :(得分:2)
在这种情况下,您需要purrr::keep
,它只保留满足谓词的元素。
purrr::keep(x, match.bases)
# [1] "AA" "GG"
正如digEmAll评论的那样,基本R等价物是Filter(match.bases, x)
。
答案 1 :(得分:2)
假设目标是根据col
中的值对行进行子集化。
我不知道在基地R中是否有更简洁的方法。
col <- c("AA", "AA", "GC", "TG", "GG", "GG", "AA", "AG")
dtf <- data.frame(col, val=1:8)
dtf[dtf$col %in% c("AA", "GG", "CC", "TT"),]
# or using your function
dtf[match.bases(dtf$col),]
# col val
# 1 AA 1
# 2 AA 2
# 5 GG 5
# 6 GG 6
# 7 AA 7
虽然如果您只想保留子集val
,可以像这样完成。不要重复名字。
with(dtf, val[col %in% c("AA", "GG", "CC", "TT")])
# or using your function
with(dtf, val[match.bases(col)])
# 1 2 5 6 7
此外,如果你想要一个像subset(x, FUN)
这样的函数,你可以只做一个:
sbst <- function(x, FUN, ...) {
x[FUN(x, ...)]
}
sbst(x, match.bases)
# "AA" "GG"
答案 2 :(得分:0)
首先,您可以直接使用名称从table
对象中检索数据,而根本不需要match
功能:
col <- c("AA", "AA", "GG", "GG", "AA", "AG")
bases <- c("AA", "GG", "CC", "TT")
table(col)[bases]
如果您想阻止NA
,请使用intersect
:
col <- c("AA", "AA", "GG", "GG", "AA", "AG")
bases <- c("AA", "GG", "CC", "TT")
table(col)[intersect(col, bases)]