我有一个看起来像 -
的数据框架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
匹配DataFrame的大小。
您可以使用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个。
df$result <- apply(df, 1, function(x) sum(x < x[1]))
使用apply
,指定1
以按行指示。如果行中每个位置的值小于第一列的值,则x < x[1]
将给出真/错误的向量。使用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