我想检查同一行中“ Pred1”和“ Pred2”列中的名称是否与“ Expected”列中的名称相同。如果名称相同,则返回TRUE,否则返回FALSE。我尝试了identical()
函数,但不确定如何为每个单元格执行此操作。
在
Expected Pred1 Pred2
Bacteroides Bacillus Bacteroides
Bifidobacterium Bifidobacterium Escherichia
出
Expected Pred1 Pred2
Bacteroides FALSE TRUE
Bifidobacterium TRUE FALSE
答案 0 :(得分:1)
您可以使用outer
。
fun <- Vectorize(function(x, y) identical(d[x, 1], d[x, y]))
cbind(d[1], Pred=outer(1:2, 2:3, fun))
# Expected Pred.1 Pred.2
# 1 Bacteroides FALSE TRUE
# 2 Bifidobacterium TRUE FALSE
或者使用==
。
sapply(1:2, function(x) d[x, 1] == d[x, 2:3])
# [,1] [,2]
# [1,] FALSE TRUE
# [2,] TRUE FALSE
d <- structure(list(Expected = c("Bacteroides", "Bifidobacterium"),
Pred1 = c("Bacillus", "Bifidobacterium"), Pred2 = c("Bacteroides",
"Escherichia")), row.names = c(NA, -2L), class = "data.frame")
答案 1 :(得分:1)
使用for循环的解决方案:
l <- list()
for(i in 2:length(df)){
l[[i]] <- df[,1] == df[,i]
}
df1 <- as.data.frame(do.call(cbind,l))
数据:
df <- data.frame(Expected = c("Bacteriodes","Bifidobacterium"),Pred1 = c("Bacillus","Bifidobacterium"),Pred2 = c("Bacteriodes","Escherichia"),stringsAsFactors = F)
答案 2 :(得分:0)
lapply()
将遍历您要检查的所有列。 ==
使用的函数将与右边的d[, 'Expected']
进行等效检查。
lapply(d[, c('Pred1', 'Pred2')], '==', d[, 'Expected'])
#equivalent to
lapply(d[, c('Pred1', 'Pred2')], function(x) x == d[, 'Expected'])
$Pred1
[1] FALSE TRUE
$Pred2
[1] TRUE FALSE
要将其设置为正确的格式,可以将它们分配回原始列。注意,我做了一个副本,但是您可以轻松地将结果分配给原始data.frame。
d_copy <- d
d_copy[, c('Pred1', 'Pred2')] <- lapply(d[, c('Pred1', 'Pred2')], '==', d[, 'Expected'])
d_copy
Expected Pred1 Pred2
1 Bacteroides FALSE TRUE
2 Bifidobacterium TRUE FALSE