【问题标题】:if statement with ddply function带有 ddply 函数的 if 语句
【发布时间】:2015-08-05 15:39:10
【问题描述】:

我正在尝试将 if 语句与 ddply 一起使用,但遇到了 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]))

我只尝试使用一列作为测试并且得到相同的结果。任何帮助都将不胜感激。 谢谢

【问题讨论】:

  • 我认为您的答案是正确的 - 输出仅包括您过滤掉所有值的 0
  • 那么如果正确的话,有没有办法去掉不符合条件的记录呢?

标签: r if-statement plyr


【解决方案1】:

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

这里真的不需要 if 语句。对您的数据进行子集化就可以了。

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

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

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

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

【讨论】:

  • 在休息并回到它之后,我意识到对数据进行子集化然后使用 ddply 代码就可以了。谢谢你的建议。
【解决方案2】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-24
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多