通过匹配模式将特定值添加到data.frame列

时间:2012-07-16 13:12:01

标签: r pattern-matching dataframe

我有两个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] TRUE FALSE TRUE

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

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

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

有人能帮忙吗?

非常感谢!

2 个答案:

答案 0 :(得分:3)

我只是真的张贴这个,因为泰勒说“如果你想要一个单线班的数据。表可能会这样做”而且我知道这绝对有可能在基地有一个班轮。我还假设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,所以我们总是能够获取感兴趣的元素。因此,在这种情况下,如果模式不在mat中,我们将获取“Y”,如果是,则为“X” - 这就是你想要的。

答案 1 :(得分:2)

这是一种方式(我将你的匹配重命名为mat,因为有一个非常重要的基本函数名为match,你可以用来解决这个问题;实际上%in%match的一种形式:< / p>

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"))

这个功能真的是为了做其他事情,但如果你想抓住它的基本部分,你可以查看源代码。