我有一个数据集,其中包含三列“时间”,“状态”和“水位”。时间变量的格式类似于“ 2007-03-22 06:45:00”,跨度多年。 status是一个只有两个值“ High”或“ Low”的二进制变量(您可以想到一个传感器,它已经日复一日,分分钟地测量了很多年,并确定测量结果是“低”还是“高”)。 / p>
time status water_level
2007-03-21 06:20:00 Low 2.4
2007-03-21 19:55:00 Low 2.3
2007-03-21 23:50:00 High 2.1
2016-04-10 19:55:00 Low 3.5
2016-04-11 23:50:00 High 3.6
我的目标是仅当该月的“高”和“低”的数目相等时,才计算每个月内的平均水位,否则我希望该月被完全去除。
我一起尝试了group_by和summerise函数,但是无法合并条件,也不知道如何执行。因此,如果有人可以帮助我,我将不胜感激。
mydata <- mydata %>%
group_by(time = floor_date(time, "month")) %>%
if(length(status == 'High') == length(status == 'Low')
{summarize(water_level = mean(water_level)}
else {summarize(water_level = 'NA'}
答案 0 :(得分:1)
也许是这样吗?
df %>%
mutate(month= months(time)) %>%
add_count(month, status) %>%
group_by(month) %>%
filter(length(unique(n)) == 1) %>%
summarise(mean_water_level = mean(water_level, na.rm=T))
# A tibble: 1 x 2
month mean_water_level
<chr> <dbl>
1 April 3.55
如果只有一个针孔的月份在过滤器中包含该术语
& length(unique(status)) == 2
答案 1 :(得分:0)
这是另一个使用与原始尝试类似的方法的选项,但是使用filter
函数而不是if
语句。
library(dplyr)
library(lubridate)
mydata %>%
group_by(time = format(time, "%Y-%m")) %>%
filter(sum(status == 'High') == sum(status == 'Low')) %>%
summarize(water_level = mean(water_level))
还要注意使用sum
而不是length
。 length(status == 'High')
将返回状态的长度,因为它将计算所有TRUE和FALSE。 sum
仅会计算TRUE。