【发布时间】:2020-10-19 21:44:51
【问题描述】:
我正在处理动物行为数据集,并尝试根据另一行中满足的条件创建一个新列(“环境”)。具体来说,如果行为介于行为“o_water”的开始/停止时间之间,我希望新列返回“water”,如果它超出这些界限,则返回“land”。如果不清楚,这里是一个最小的例子:
library(dplyr)
library(magrittr)
otters <- data.frame(
observation_id = 1,
subject = 1,
behavior = c("o_water", "swim", "float", "o_land", "walk", "o_water", "float"),
start_time = c(1,1,2,6,6,11,11),
stop_time = c(5,3,4,10,9,15,14)
)
#this does it, but manually. need to go over very large dataset and search for conditions
otters <- otters %>%
group_by(subject, observation_id, behavior) %>%
mutate(environment = ifelse((start_time >= 1 & stop_time <= 5) |
(start_time >= 11 & stop_time <= 15), "water", "land"))
这是所需的输出。
Groups: subject, observation_id, behavior [5]
observation_id subject behavior start_time stop_time environment
<dbl> <dbl> <fct> <dbl> <dbl> <chr>
1 1 1 o_water 1 5 water
2 1 1 swim 1 3 water
3 1 1 float 2 4 water
4 1 1 o_land 6 10 land
5 1 1 walk 6 9 land
6 1 1 o_water 11 15 water
7 1 1 float 11 14 water
第二组命令是我想要的,但我需要它来搜索并将其应用于整个数据集,而不是输入每个参数。分组是为了在适用的行上执行功能;在完整的数据集中,有多个主题和observation_id。
我尝试使用 when() 和 case_when() 无济于事,但我是 R 的新手,因此不胜感激!
对我所做的任何失误表示歉意。我无法在 stackoverflow 的其他地方找到类似的问题。
【问题讨论】:
-
第一篇文章的准备工作很好。但是,由于您的管道准确地提供了所需的输出,我不清楚您想看到什么。
-
谢谢,很抱歉造成混乱。基本上我试图找到一种方法来编写 ifelse() 而不必指定每个“o_water”的确切开头和结尾,因为实际数据集很大。 IE。有多个“o_water”等等,每个都有不同的observation_id和主题。
-
我已经编辑了示例以包含“o_water”的第二个实例。因此,需要设置另一个条件以包含第二个“o_water”;我正在寻找一种方法来避免这种情况。基本上,“x 行为是否发生在 'o_water' 的开始/结束时间内?”
标签: r if-statement dplyr