将矢量与数据帧进行比较

时间:2017-12-13 19:52:55

标签: r compare

我的数据框看起来像 -

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以匹配数据帧大小的方法。

2 个答案:

答案 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