我有两个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命令中完成: - )
有人能帮忙吗?
非常感谢!
答案 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"))
这个功能真的是为了做其他事情,但如果你想抓住它的基本部分,你可以查看源代码。