我需要知道该行的哪些元素对于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))
但这不是我所需要的。
非常感谢您的建议!
答案 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")