【问题标题】:For each column in a data.frame find rows where column is the only one to have positive value对于 data.frame 中的每一列,查找其中 column 是唯一具有正值的行
【发布时间】:2019-01-21 09:44:03
【问题描述】:

我需要知道行的哪些元素对于 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))

但这不是我需要的..

非常感谢您的建议!

【问题讨论】:

  • @RonakShah 是的,我的错,应该有 S2,正如你所说,你是对的。
  • 逻辑对我来说似乎很清楚。如果 A 列是 s2 行中唯一具有正值的列,则为该列返回 s2。您可以看到 C 列没有正值,而其他列没有正值。
  • @snoram 是的,完全正确。
  • 所以在 n 次 p 数据帧 x 中,您定义的值 x[i, j] (i = 1, ..., n 和 j = 1, ... , p)要在第 j 列中“唯一”是:所有值 x[i, -j] 都等于 0,对吗?

标签: r dataframe unique


【解决方案1】:

这是一个粗略的基础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")

【讨论】:

  • @AndrewK。酷,你的问题有点不寻常。我只是添加了一个更简单的解决方案。
  • 第二个选项应该是高效的一个
  • @akrun 因为它没有额外的if (all(!x)),对吧?还是看看别的?
  • 是的,没有额外的步骤可以转换成data.frame
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多