比较数据框中不同列的行

时间:2016-02-17 14:08:53

标签: r dataframe compare

我的数据框看起来像这样:

id   value1  value2   value3   value4
A      14       24       22        9
B      51       25       29       33
C       4       16        8       10
D       1        4        2        4       

现在我想比较该行的每一列与其他行,以便识别每个值更高的行。

因此,例如对于id D,这将是A,B和C. 对于C,它将是B,对于A它的B而对于B则没有行。

我尝试通过遍历行并比较每一列来做到这一点,但这需要花费很多时间。原始数据集有大约5000行和20列要比较。 我确信有一种方法可以更有效地做到这一点。谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

我认为这很好用:

ind <- which(names(df) == "id")
apply(df[,-ind],1,function(x) df$id[!rowSums(!t(x < t(df[,-ind])))] )
# [[1]]
# [1] "B"
# 
# [[2]]
# character(0)
# 
# [[3]]
# [1] "B"
# 
# [[4]]
# [1] "A" "B" "C"

答案 1 :(得分:1)

我不知道执行此任务的简单功能。 我就是这样做的。

library(dplyr)

DF <- data.frame(
  id = c("A", "B", "C", "D"),
  value1 = c(14, 51, 4, 1),
  value2 = c(24, 25, 16, 4),
  value3 = c(22, 29, 8, 2),
  value4 = c(9, 33, 10, 4),
  stringsAsFactors = FALSE)

# get the order for each value
tmp <- lapply(select(DF, -id), function(x) DF$id[order(x)]) 

# find a set of "biggers" for each id 
tmp <- lapply(tmp, function(x) data.frame(
    id = rep(x, rev(seq_along(x))-1), 
    bigger = x[lapply(seq_along(x), function(i)
      which(seq_along(x) > i)) %>% unlist()],
    stringsAsFactors = FALSE)) 

# inner_join all, this keeps "biggers" in all columns
out <- NULL
for (v in tmp) {
  if (is.null(out)) {
    out <- v
  } else {
    out <- inner_join(out, v, by = c("id", "bigger"))
  }
}

这会让你:

out
#  id bigger
#1  D      C
#2  D      A
#3  D      B
#4  C      B
#5  A      B

答案 2 :(得分:1)

这是一种以数据帧格式返回结果的方法。

     id    id2 all_less
  (fctr) (fctr)    (lgl)
1      A      B     TRUE
2      C      B     TRUE
3      D      A     TRUE
4      D      B     TRUE
5      D      C     TRUE

结果(ID小于id2)

d <- structure(list(
  id = structure(1:4, .Label = c("A", "B", "C", "D"), class = "factor"), 
  value1 = c(14L, 51L, 4L, 1L), 
  value2 = c(24L, 25L, 16L, 4L), 
  value3 = c(22L, 29L, 8L, 2L), value4 = c(9L, 33L, 10L, 4L)
), 
.Names = c("id", "value1", "value2", "value3", "value4"), 
class = "data.frame", row.names = c(NA, -4L)
)

数据

li