我有以下数据
> site<-c("A","A","A","B","B","C")
> sample<-c("N","N","N","W","W","S")
> effort<-c(2,2,2,1,1,3)
> y<-c(1,0,1,1,0,1)
> df<-data.frame(site,sample,effort,y)
> df
site sample effort y
1 A N 2 1
2 A N 2 0
3 A N 2 1
4 B W 1 1
5 B W 1 0
6 C S 3 1
我想重新排列以获得最小的“努力”,并为每个样本和网站加上“y”。
最终得到以下内容
site sample effort y
1 A N 2 2
2 B W 1 1
3 C S 3 1
我尝试过以下代码
tr<-aggregate(.~site+sample,data=df, FUN=function(df) c(m=min(df), n=length(df)))
> tr
site sample effort.m effort.n y.m y.n
1 A N 2 3 0 3
2 C S 3 1 1 1
3 B W 1 2 0 2
这几乎是我正在寻找的,但有更好的方法来做到这一点,我应该如何处理数据中的零?
答案 0 :(得分:2)
使用强大的dplyr
包
library(dplyr)
df %.%
group_by(site,sample) %.%
select(site, sample) %.%
summarise (
mineff = min(effort),
y = sum(y))
site sample mineff y
1 C S 3 1
2 A N 2 2
3 B W 1 1
答案 1 :(得分:1)
使用plyr
require(plyr)
ddply(df, c("site", "sample"), summarize,
min_eff = min(effort), sum_y = sum(y))
site sample min_eff sum_y
1 A N 2 2
2 B W 1 1
3 C S 3 1
在您的示例中,站点和示例之间存在一对一的对应关系。这种方法适用于每个成对的不同组合。至于
我应该如何处理数据中的零?
你想如何处理它们?你有什么顾虑?