我有一个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的解决方案。
答案 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