将向量与data.frame中的行子集进行比较

时间:2017-05-10 08:38:06

标签: r

我有一个data.frame“dat”和一个数字向量“test”:

code <- c("A22", "B15", "C03")
v.1 <- 1:3
v.2 <- 3:1
v.3 <- c(2, NA, 2)
bob <- c("yes", "no", "no")
dat <- data.frame(code, v.1, v.2, v.3, bob, stringsAsFactors = FALSE)
test <- c(3, 1, 2)

我想在data.frame中找到第二到第四列(“v.1”,“v.2”,“v.3”)包含与向量相同的值的行,在同一行中order,并从“code”列返回值(在本例中为“C03”)。

我试过

dat[dat[, 2:4] == test]$code

which(apply(dat, 1, function(x) all.equal(dat[, 2:4], test)) == FALSE)

这两个都不起作用。

我更喜欢基础R的解决方案。

3 个答案:

答案 0 :(得分:2)

您的第二个选项(使用which)不适用于多个问题:在整个apply上使用dat会将其转换为matrix character,你实际上没有使用x函数参数,你应该使用all而不是all.equal,而不是TRUE而不是FALSE(比较实际上并不需要。)

您可以对其进行一些修改以使其正常工作:

which(apply(dat[, 2:4], 1, function(x) all(x==test)))
[1] 3

或者

dat[apply(dat[, 2:4], 1, function(x) all(x==test)), "code"]
[1] C03

答案 1 :(得分:1)

使用apply,我们可以将paste列放在一起,并在粘贴到一起时检查哪一行与test的值相同,并选择相应行的列code

dat[apply(dat[2:4], 1, paste0, collapse = "|") == 
                       paste0(test, collapse = "|"), "code"]

#[1] C03

答案 2 :(得分:0)

我们只需复制“测试”即可。在进行比较之前使长度相等

dat[2:4] == test[row(dat[2:4])]

如果我们需要&#39;代码&#39;

dat$code[rowSums(dat[2:4] == test[row(dat[2:4])], na.rm = TRUE)==3]
#[1] C03