我的数据框看起来像 -
test A B C
28 67 4 23
45 82 43 56
34 8 24 42
我需要将test
与其他三列进行比较,因为我只需要另一列中的元素数小于测试列中相应元素的数量。
所以期望的输出是 -
test A B C result
28 67 4 23 2
45 82 43 56 1
34 8 24 42 2
当我尝试时 -
comp_vec = "test"
name_vec = c("A", "B", "C")
rowSums(df[, comp_vec] > df[, name_vec])
我收到了错误 -
Error in Ops.data.frame(df[, comp_vec], df[, name_vec]) :
‘>’ only defined for equally-sized data frames
我正在寻找一种不复制test
以匹配数据帧大小的方法。
答案 0 :(得分:2)
您可以使用sapply
返回将df$test
列映射到其他三列的向量。这将返回您可以rowSums
执行的T / F矩阵,并设置为result
列。
df <- data.frame(test = c(28, 45, 34), A = c(67, 82, 8), B = c(4, 43, 24), C = c(23, 56, 42))
df$result <- rowSums(sapply(df[,2:4], function(x) df$test > x))
> df
test A B C result
1 28 67 4 23 2
2 45 82 43 56 1
3 34 8 24 42 2
我注意到你的预期结果在A的第二行有82,而在你的开始例子中有5。
答案 1 :(得分:0)
df$result <- apply(df, 1, function(x) sum(x < x[1]))
使用apply
,指定1
按行指示。如果行中每个位置的值小于第一列的值,x < x[1]
将给出一个TRUE / FALSE的向量。使用sum
来提供TRUE
值的数量。
# test A B C result
# 1 28 67 4 23 2
# 2 45 82 43 56 1
# 3 34 8 24 42 2