if语句带有ddply函数

时间:2015-08-05 15:39:11

标签: r if-statement plyr

我正在尝试使用带有ddply的if语句,但是我遇到了if语句的问题。

示例数据集是:

data<-data.frame(Gear=c(rep("S",10),rep("C",10)),TowSurvey=c(0,0,1,1,0,1,1,1,1,0),TowCom=c(0,1,1,1,0,1,1,1,1,0),
    StationID=c(1,2,3,4,5,6,7,8,9,10),Totwght=c(2,8,6,4,12,9,56,7,89,10),Totexpwght=c(5,8,12,45,89,56,23,78,56,41),
    Expnum=c(1,5,6,98,45,2,6,3,7,45),Exp=c(56,25,85,74,1,23,56,45,89,75))

我的第一次尝试是

if(data$Gear=="S" & data$TowSurvey== 1 | data$Gear=="C" & data$TowCom== 1){
    datad<-ddply(data, .(StationID,Gear), summarize,Totwghtpertow=sum(Totwght),
    Totexppertow=sum(Totexpwght),Totnum =sum(Expnum),Totexpnum=sum(Exp))}
print(datad)

但是,不符合if语句标准的记录包含在datad中。

然后我发现这篇文章:聚合(计数)符合条件的行,按唯一值分组。 Aggregate (count) rows that match a condition, group by unique values

所以基于帖子答案的第二次尝试是

datad<-ddply(data, .(StationID,Gear), summarize,Totwghtpertow=sum(Totwght[Gear=="S" & TowSurvey== 1 | Gear=="C" & TowCom== 1]))

我只尝试使用一列作为测试,并得到相同的结果。在尝试解决这个问题时,我们将不胜感激。 谢谢

2 个答案:

答案 0 :(得分:1)

如果你第一次尝试运行,你应该会收到一条错误消息,因为if只能评估长度为1的逻辑向量。

你真的不需要if声明。对数据进行子集也可以。

data_sub <- subset(data, (data$Gear=="S" & data$TowSurvey== 1) | (data$Gear=="C" & data$TowCom== 1))

您可以使用ddply而不是data_sub来运行data语句。

或者,如果你要使用很多东西,你可以把它包装在一个函数中:

datad_func <- function(data){
data_sub <- subset(data, (data$Gear=="S" & data$TowSurvey== 1) | (data$Gear=="C" & data$TowCom== 1))
datad<-ddply(data_sub, .(StationID,Gear), summarize,Totwghtpertow=sum(Totwght),
             Totexppertow=sum(Totexpwght),Totnum =sum(Expnum),Totexpnum=sum(Exp))
rm('data_sub')
print(datad)
}

datad_func(data)

   StationID Gear Totwghtpertow Totexppertow Totnum Totexpnum
1          2    C             8            8      5        25
2          3    C             6           12      6        85
3          3    S             6           12      6        85
4          4    C             4           45     98        74
5          4    S             4           45     98        74
6          6    C             9           56      2        23
7          6    S             9           56      2        23
8          7    C            56           23      6        56
9          7    S            56           23      6        56
10         8    C             7           78      3        45
11         8    S             7           78      3        45
12         9    C            89           56      7        89
13         9    S            89           56      7        89

答案 1 :(得分:0)

plyr在函数中的子集化方面并不是很擅长,所以你可以像@scribbles那样在之前或之后进行。

您也可以尝试dplyr并将它们组合在一起:

library(dplyr)
data %>% filter((data$Gear == "S" & data$TowSurvey == 1) | (data$Gear == "C" & data$TowCom == 1)) %>%
         group_by(StationID, Gear) %>% 
         summarise_each(funs(sum), Totwght, Totexpwght, Expnum, Exp)