我有一个由地球化学样品结果组成的数据框,其中包括以下变量:
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
有人对这些错误有解释吗?或针对我的问题的更好解决方案?
谢谢!
答案 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
的元素数大于0
,sum(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
参数)。