【问题标题】:count up number of rows that have > 0 count in R data frame计算 R 数据框中计数 > 0 的行数
【发布时间】:2018-06-18 00:21:51
【问题描述】:

我有一个数据框df。它看起来像:

xSample    a b  c
x          2 0  2
x1         3 0  0
x2         4 0  2 

我有这段代码: new_df <- as.data.frame(sapply(df[,-1], function(x) sum(as.numeric(x) > 0)))

我想遍历df 的每一列并计算样本数并将其放入new_df,但前提是每个样本 A、B 或 C 的计数 > 0...@987654327 @应该看起来像这样:

       NonZeroCounts
a         3 
c         2  

b 行未被保留,因为它在每一行中都有 0 个计数。

在我的df 上运行我上面提到的函数后,输出是:

xSample     NonZeroCounts
a          3 
b          0 
c          2

【问题讨论】:

  • 你可以删除NonZeroCounts == 0所在的那一行。 Filter data.frame rows by a logical condition 应该可以帮助您。
  • ...或者您可以在 ifelse 语句中包含 sum 语句,如果 sum 等于零,则返回 NULL ....它将删除该行。
  • data.frame(NonZeroCounts = sapply(df1[-1], function(x) sum(x>0))[colSums(df1[-1]) > 0])
  • @d.b 这太好了,谢谢。如果您将此添加为答案,我可以接受。

标签: r


【解决方案1】:

首先,使用sapply遍历相关列,获取非零值的个数。然后,使用colSums 仅对大于0 的值进行子集化

data.frame(NonZeroCounts = sapply(df1[-1], function(x)
    sum(x>0))[colSums(df1[-1]) > 0])
#  NonZeroCounts
#a             3
#c             2

数据

df1 = structure(list(xSample = c("x", "x1", "x2"), a = 2:4, b = c(0L, 
0L, 0L), c = c(2L, 0L, 2L)), .Names = c("xSample", "a", "b", 
"c"), class = "data.frame", row.names = c(NA, -3L))

【讨论】:

  • 虽然此代码 sn-p 可能是解决方案,但包含解释确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因
【解决方案2】:

另一种方法:

## Your data
df <- data.frame(a = c(2, 3, 4), b = c(0, 0, 0), c = c(2, 0, 2))

data.frame(NonZeroCounts=colSums(df!=0)[colSums(df!=0)!=0])

#    NonZeroCounts
#a          3
#c          2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多