【问题标题】:R - countifs like excelR - 像 excel 这样的计数
【发布时间】:2023-03-09 01:34:01
【问题描述】:

我有一个这样的 CSV,保存为 R 中名为 df1 的对象。

 X Y Z Year
 0 2 4 2014
 3 1 3 2014
 5 4 0 2014
 0 3 0 2014
 2 1 0 2015

我想:

  1. 计算 2014 年没有“0”的每一列。例如,对于 X 列,计数 = 2(不是 3,因为我只想要 2014 年的数据)。对于 Y 列,计数为 4。对于 Z 列,计数为 1。

  2. 对每一列的所有计数求和

这是我尝试过的:

count_total <- sum(df1$x != 0 &
                   df1$y != 0 &
                   df1&z != 0 &
                   df1$Year == 2014)
count_total

我希望输出只是 1(即 df 中的第二行没有 0)

但是,这与我在 excel 上的计数不一致。在excel中是这样的:

=COUNTIFS('df1'!$A$2:$A$859,"<>0",'df1'!$B$2:$B$859,"<>0",
          'df1'!$C$2:$C$859,"<>0",'df1'!$D$2:$D$859,2014)

想知道我是否在 R 上输入错误?我是 dyplr 用户,但在 google 上找不到特别有用的东西。

非常感谢!

【问题讨论】:

  • 您的预期输出 1 如何表示 df 中的第二行没有 0?
  • 澄清一下,输出意味着有 1 行没有 0。
  • 类似这样的东西:colSums(d[d$Year == 2014, 1:3] != 0)?
  • 作为记录,请注意R FAQ 7.31。您可能需要使用sum(abs(df1$x) &lt; 0.001, abs(df1$y) &lt; 0.001, ...)(或您需要的任何机制......关键是当条件合适时,它可以显示为0 != 0)。
  • 您的“我想:”和“我希望输出为:”部分具有误导性并且彼此不一致。

标签: r


【解决方案1】:

一种方法是在subset 的数据上使用rowSums

sum(rowSums(subset(df1, Year == 2014) == 0) == 0)
#[1] 1

【讨论】:

  • 我相信 OP 想要 colSums(. != 0) 并且我看不到外部 sum 有什么用处。
  • @RuiBarradas 我对 OP 的预期输出感到困惑,因为 OP 说 I want the output to be simply be 1 (i.e. the 2nd row in df has no 0's) 。如果这不是 OP 想要的,我可能会删除它。 PS - 我正在计算其中没有 0 的行数。
【解决方案2】:

您可以使用aggregate 然后colSums 来按列获取总数。

agg <- aggregate(. ~ Year, df1, function(x) sum(x != 0))
agg
#  Year X Y Z
#1 2014 2 4 2
#2 2015 1 1 0

colSums(agg[-1])
#X Y Z 
#3 5 2

数据。

df1 <- read.table(text = "
X Y Z Year
 0 2 4 2014
 3 1 3 2014
 5 4 0 2014
 0 3 0 2014
 2 1 0 2015
",header = TRUE)

【讨论】:

    【解决方案3】:

    dplyrapproach:

    library(dplyr)
    df1 %>% 
      group_by(Year) %>% 
      summarise_at(vars(X:Z), function (x) sum(x != 0))
    

    输出:

    # A tibble: 2 x 4
    #    Year     X     Y     Z
    #   <int> <int> <int> <int>
    # 1  2014     2     4     2
    # 2  2015     1     1     0
    

    【讨论】:

      【解决方案4】:

      替代使用summaryBy

      library(doBy)
      summaryBy(list(c('X','Y','Z'), c('Year')), df1, FUN= function(x) sum(x!=0), keep.names=T)
      
        Year X Y Z
      1 2014 2 4 2
      2 2015 1 1 0
      

      如前所述,需要时使用colSums

      【讨论】:

        猜你喜欢
        • 2018-04-26
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 2019-12-08
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多