用条件按组查找最大列

时间:2018-07-13 19:24:05

标签: r for-loop if-statement dplyr aggregate

我有一个像这样的数据框:

enter image description here

对于每个腮,我想找到Diameter不同于0的最长时间。我试图使用函数aggregate和dplyr包,但这没有用。 for,if和aggregation的组合可能会起作用,但是我没有找到如何做的方法。

我不确定解决此问题的最佳方法。我将不胜感激。

3 个答案:

答案 0 :(得分:1)

按“吉尔”分组后,对“时间”进行子集化,其中“直径”不为0并获得max(假设“时间”为numeric类)

library(dplyr)
df1 %>%
  group_by(Gill) %>%
  summarise(Time = max(Time[Diametre != 0]))

答案 1 :(得分:0)

在这里如何使用aggregate

> df<- data.frame(
    Gill = rep(1:11, each = 2),
    diameter = c(0,0,1,0,0,0,73.36, 80.08,1,25.2,53.48,61.21,28.8,28.66,71.2,80.25,44.55,53.50,60.91,0,11,74.22),
    time = 0.16
  )
> df
   Gill diameter time
1     1     0.00 0.16
2     1     0.00 0.16
3     2     1.00 0.16
4     2     0.00 0.16
5     3     0.00 0.16
6     3     0.00 0.16
7     4    73.36 0.16
8     4    80.08 0.16
9     5     1.00 0.16
10    5    25.20 0.16
11    6    53.48 0.16
12    6    61.21 0.16
13    7    28.80 0.16
14    7    28.66 0.16
15    8    71.20 0.16
16    8    80.25 0.16
17    9    44.55 0.16
18    9    53.50 0.16
19   10    60.91 0.16
20   10     0.00 0.16
21   11    11.00 0.16
22   11    74.22 0.16
> # Remove diameter == 0 before aggregate
> dfnew <- df[df$diameter != 0, ]
> aggregate(dfnew$time, list(dfnew$Gill), max )
  Group.1    x
1       2 0.16
2       4 0.16
3       5 0.16
4       6 0.16
5       7 0.16
6       8 0.16
7       9 0.16
8      10 0.16
9      11 0.16

答案 2 :(得分:0)

我将使用不同于akrun建议的优雅解决方案的方法。我知道如何使用此方法来创建您在图片中显示的MaxTime列。

#This will split your df into a list of data frames for each gill.
list.df <- split(df1, df1$Gill)

然后,您可以使用lapply查找每个Gill的最大时间,然后将该值设置为名为MaxTime的新列。

lapply(list.df, function(x) mutate(x, MaxTime = max(x$Time[x$Diametre != 0])))

然后,您可以使用bind_rows()将这些拆分的数据帧重新组合在一起

df1 = bind_rows(list.df)