如何避免R

时间:2017-10-08 10:03:39

标签: r

我现在一直在使用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
}

3 个答案:

答案 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)]