4

我有两个data.frames:

pattern <- data.frame(pattern = c("A", "B", "C", "D"), val = c(1, 1, 2, 2))

match <- data.frame(match = c("A", "C"))

我想向我的 data.frame 模式添加另一个名为 new_val 的列,并将“X”分配给列模式的值在 data.frame 匹配中的每一行,否则分配“Y”

is.element(pattern$pattern, match$match)

[1] 真假真假

因此,生成的 data.frame 应如下所示:

    pattern val new_val
1   A       1   X
2   B       1   Y
3   C       2   X
4   D       2   Y

我用丑陋的for循环实现了它,但我相信这几乎可以在一行R命令中使用花哨的东西完成:-)

有人能帮忙吗?

非常感谢!

4

2 回答 2

3

我只是在 Tyler 说“如果你想要一个单衬 data.table 可能会这样做”之后才真正发布这个,而且我知道在基础中使用一个衬里绝对是可能的。我还假设match已重命名为mat.

  pattern$new_val <- c("Y", "X")[(pattern$pattern %in% mat)+1]
  pattern
#  pattern val new_val
#1       A   1       X
#2       B   1       Y
#3       C   2       X
#4       D   2       Y

pattern$pattern %in% mat正在查找模式的哪些元素在 mat 中,如果在 mat 中则返回 TRUE,如果不在则返回 FALSE。然后我加 1 使其成为 1-2 范围内的数字,以便它可以用于索引。然后我们将其用作自定义向量的索引,c("Y", "X")并且由于我们创建的索引始终为 1 或 2,因此我们始终能够获取感兴趣的元素。所以在这种情况下,如果图案不在垫子中,我们将抓住“Y”,如果是,我们将抓住“X”——这就是你想要的。

于 2012-07-16T13:59:42.967 回答
2

这是一种方法(我将您的 match 重命名为 mat ,因为有一个非常重要的名为 match 的基本函数,您实际上可以使用它来解决这个问题;实际上%in%是一种形式match

pattern <- data.frame(pattern = c("A", "B", "C", "D"), val = c(1, 1, 2, 2))
mat <- c("A", "C")

pattern$new_val <- "Y"                            #pre allot everything to be Y
pattern$new_val[pattern$pattern %in% mat] <- "X"  #replace any A or C with an X
pattern

PS如果你想要一个班轮data.table可能会这样做。

如果你想要一些更复杂的东西,你可以使用我正在处理的包中的一个函数:

library(qdap)

#original problem
pattern$new_val <- text2color(pattern$pattern, list(c("A", "C")), c("X", "Y"))

#extending it
#makes D  a 5
text2color(pattern$pattern, list(c("A", "C"), "D"), c("X", 5, "Y"))

这个函数实际上是为了做其他事情而设计的,但如果你想了解它的基本部分,你可以查看源代码。

于 2012-07-16T13:20:41.083 回答