我有一个像这样的数据框:
对于每个腮,我想找到Diameter不同于0的最长时间。我试图使用函数aggregate和dplyr包,但这没有用。 for,if和aggregation的组合可能会起作用,但是我没有找到如何做的方法。
我不确定解决此问题的最佳方法。我将不胜感激。
答案 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)