如何计算R中分组数据框中每列中的观察数

时间:2019-02-26 00:30:16

标签: r dplyr tidyverse

我有一个由地球化学样品结果组成的数据框,其中包括以下变量:

Year, Zone, *48 analyzed elements*, *more information*.

我想知道每年每个区域每个元素收集了多少个样本。所以基本上,我想要一个看起来像这样的表:

Year,Zone,Ag_ppm, ..., Zr_ppm
1981, ZoneA, 0, ..., 0 
1981, ZoneB, 20, ..., 0
1983, ZoneA, 0, ..., 150 

我尝试了以下方法:

 Elt_count <- SoilGeology %>%
  group_by(Year, Zone) %>%
  summarise_at(vars(Ag_ppm:Zr_ppm),funs(sum)) %>%
  select(Year, Zone, Ag_ppm:Zr_ppm)

它可以工作,但是没有提供我想要的信息(我不希望样本的累加和,而是每个样本的计数)。 然后,我尝试了:

Elt_count <- SoilGeology %>%
  group_by(Year, Zone) %>%
  summarise_at(vars(Ag_ppm:Zr_ppm),funs(n)) %>%
  select(Year, Zone, Ag_ppm:Zr_ppm)

但是出现以下错误:Error in summarise_impl(.data, dots) : n()does not take arguments

我也尝试过:

d <- SoilGeology %>%
  group_by(Year, Zone) %>%
  summarise_all(n) %>%
  select(Year, Zone, Ag_ppm:Zr_ppm)

但是我收到与上述相同的错误:Error in summarise_impl(.data, dots) : n()does not take arguments

还尝试了数:

Elt_count <- SoilGeology %>%
  group_by(Year, Zone) %>%
  count(Au_ppm:Zr_ppm, na.rm = TRUE) %>%
  select(Year, Zone, Ag_ppm:Zr_ppm)

但是,我得到了错误:

Error in mutate_impl(.data, dots) : Evaluation error: NA/NaN argument.
In addition: Warning messages:
1: In Au_ppm:Zr_ppm :
  numerical expression has 52 elements: only the first used
2: In Au_ppm:Zr_ppm :
  numerical expression has 52 elements: only the first used

有人对这些错误有解释吗?或针对我的问题的更好解决方案?

谢谢!

2 个答案:

答案 0 :(得分:0)

也许下面的代码是您想要的。

library(dplyr) count(SoilGeology, year, zone, Ag_ppm:Zr_ppm)

或等效于管道功能

SoilGeology %>% count(SoilGeology, year, zone, Ag_ppm:Zr_ppm)

或者,

SoilGeology %>% group_by(year, zone, Ag_ppm:Zr_ppm) %>% summarise(number = n())

SoilGeology %>% group_by(year, zone, Ag_ppm:Zr_ppm) %>% tally()

如果错误仍然存​​在,则应检查变量的'class()'。值可能需要强制为数字。如果需要,请尝试variable -> as.numeric(variable),然后重试。

答案 1 :(得分:0)

sum添加数字,n()count()计数行。如果数字大于0对您有特殊含义,则需要告诉R。计算满足条件的事物数的经典方法是sum(..test for condition..),因此,如果您希望x的元素数大于0sum(x > 0)会做它。这是您要应用于所有列的功能:

# reproducible example on built-in data
mtcars %>%
  group_by(cyl) %>%
  summarize_at(vars(disp:carb), function(x) sum(x > 5))

# for your data
Elt_count <- SoilGeology %>%
  group_by(Year, Zone) %>%
  summarise_at(vars(Ag_ppm:Zr_ppm), function(x) sum(x > 0))

我不知道您的数据。如果您也要计算负数,则可能需要将其更改为sum(x != 0)。如果缺少值sum(x > 0, na.rm = TRUE)(如果您查看?sum,则确实带有一个na.rm参数)。