对于data.frame中的每一列,请找到行,其中column是唯一具有正值的行

时间:2019-01-21 09:44:03

标签: r dataframe unique

我需要知道该行的哪些元素对于data.frame中的每一列都是唯一的,然后在输出中打印行名。

我的数据示例:

id  A   B   C
s1  1   2   1
s2  1   0   0
s3  0   12  3
s4  0   1   0
s5  0   1   0

我想要这样的东西:

$A s2
$B s4,s5
$C NA 

这意味着:

A只有一个唯一元素-s2

B有两个独特的元素-s4和s5

并且C没有任何唯一元素,因此由NA填充

我尝试过

apply(data, 2, function(x) unique(x))

但这不是我所需要的。

非常感谢您的建议!

1 个答案:

答案 0 :(得分:2)

这是一个粗略的R解决方案:

helper <- function(x) {
  has_p <- x > 0
  if (sum(has_p) != 1) has_p[] <- FALSE 
  has_p
}
step1 <- as.data.frame(t(apply(df[-1], 1, helper)))

lapply(step1, function(x) df[[1]][x])

$A
[1] "s2"

$B
[1] "s4" "s5"

$C
character(0)

修改

对于相同的解决方案,这是一个简单得多的逻辑:

rows <- rowSums(df[-1] > 0) == 1
lapply(df[-1], function(x) df[["id"]][rows & x > 0])

编辑2

进入第一步(并在没有唯一性时添加正确的输出NA):

lapply(
  as.data.frame(df[-1] > 0 & rowSums(df[-1] > 0) == 1),
  function(x) {
    if (all(!x)) return(NA)
    df[["id"]][x]
  }
)

数据

df <- structure(list(id = c("s1", "s2", "s3", "s4", "s5"), A = c(1L, 
1L, 0L, 0L, 0L), B = c(2L, 0L, 12L, 1L, 1L), C = c(1L, 0L, 3L, 
0L, 0L)), row.names = c(NA, -5L), class = "data.frame")