R和dplyr,使用group_by在每个组中运行代码不起作用

时间:2019-03-06 02:43:24

标签: r dplyr

首先,我对R还是很陌生,所以我对这里发生的事情可能不太了解,但是我仍然停留在这段代码上,我需要快速修复它,因此感谢您的参与先发制人。

我正在尝试查找每年每条路线的冰点,基本上这将在CT值超过阈值9时发生。这是因为我正在处理北极数据,因此CT值将开始为高于9,我必须找到它首先从低于阈值到高于9的阈值。在某些地方,这种局部最小值有函数,但我不知道它们是什么。

我尝试制作一个长的管道语句,但是在引用列时遇到了一些麻烦,因此我尝试在管道语句之外进行group_by,但这也不起作用。

编辑:这是一个示例。 我想以1983年东部和1984年东部的1个值(年份)结束。正确的返回值分别是6和18。

Route Year  Day_Year    CT
East  1983  1           3
East  1983  2           2
East  1983  3           1
East  1983  4           0
East  1983  5           2
East  1983  6           9.5
East  1984  1           3   
East  1984  3           2
East  1984  9           1
East  1984  10          0
East  1984  14          2
East  1984  18          9.5


library("dplyr")
data_g <- group_by(Sea_Ice, Route, Year)

#Above 9 Freeze-Up
Above_9_A <- 
  #group_by(Sea_Ice, Route, Year) %>%
  data_g %>%
  mutate(row.position = which.min(data_g$CT))%>%
  filter(CT > 9, !SA %in% c("New Ice", "Nilas", "Grey Ice", "Open Water")) %>%
  slice(which.min(Day_Year)) %>%
  mutate(Conc_Threshold = "Above_9")

我目前正在做的事情是找到所有年份所有路由的最小值。

我只是不知道从这里去哪里,谢谢您的帮助。

编辑2:我暂时已删除其他列的过滤器,因为这不是我的问题

1 个答案:

答案 0 :(得分:1)

您需要做的是创建一个当前一个数字都小于9并且当前数字大于9时将为TRUE的列。这是您可以执行的操作:

data_g %>% group_by(route, year) %>% 
  mutate(freezepoint=(cumsum(CT<9)>0 & CT>=9)) %>% 
  filter(freezepoint)

或者,更直接地:

data_g %>% group_by(route,year) %>% slice(which.max(cumsum(CT<9)>0 & CT>=9))

(注意:这假定data.frame已按天排列)