简体   繁体   中英

Compare vector to a dataframe

I have a dataframe that looks something like -

test   A   B   C
  28  67   4  23
  45  82  43  56
  34  8   24  42

I need to compare test to the other three columns in that I just need the number of elements in the other column that is less than the corresponding element in the test column.

So the desired output is -

test   A   B   C result
  28  67   4  23      2
  45  82  43  56      1
  34  8   24  42      2

When I tried -

comp_vec = "test"
name_vec = c("A", "B", "C")
rowSums(df[, comp_vec] > df[, name_vec])

I get the error -

Error in Ops.data.frame(df[, comp_vec], df[, name_vec]) : 
‘>’ only defined for equally-sized data frames

I am looking for a way without replicating test to match size of dataframe.

You can use sapply to return a vector of mapping the df$test column against the other three columns. That will return a T/F matrix that you can do rowSums , and set as your result column.

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

I noticed your expected results has 82 for the second row of A, whereas its 5 in your starting example.

df$result <- apply(df, 1, function(x) sum(x < x[1]))

Use apply , specify 1 to indicate by row. x < x[1] will give a vector of TRUE/FALSE if the value at each position in the row is smaller than the first column's value. Use sum to give the number of TRUE values.

#   test  A  B  C result
# 1   28 67  4 23      2
# 2   45 82 43 56      1
# 3   34  8 24 42      2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM