如何解决是否可以仅在选定的组内进行突变?
我想知道mutate
是否有可能仅将功能应用于选定的组(而不是观察值!)?
我有多个变量来指示对象是否在给定的时间点受到了特定种类的处理。
df <- data.frame(id = c(1,1,2,2),treatment = c(0,0))
我旨在通过以下方式对治疗的相对时间进行变量设置:
df %>%
group_by(id) %>%
mutate(relative_time = seq_along(treatment) - which(treatment %in% 1))
id treatment relative_time
<dbl> <dbl> <int>
1 1 0 -2
2 1 0 -1
3 1 1 0
4 1 0 1
5 2 0 -1
6 2 1 0
7 2 0 1
但是,问题是如何处理未得到治疗的群体?
df <- data.frame(id = c(1,0))
我尝试应用ifelse()
来排除全零的组。它确实排除了未治疗的组,但是那时治疗组的结果是错误的。似乎该组的所有元素都被分配了seq_along(...) - which(...)
的第一个元素:
df %>%
group_by(id) %>%
mutate(relative_time = ifelse(sum(treatment) > 0,seq_along(treatment) - which(treatment %in% 1),NA))
id treatment relative_time
<dbl> <dbl> <int>
1 1 0 -2
2 1 0 -2
3 1 1 -2
4 1 0 -2
5 2 0 NA
6 2 0 NA
7 2 0 NA
由于我有很多这样的治疗方法,所以我想避免针对每种治疗类型过滤并创建多个数据帧,而应该使用mutate_at()
。
感谢您的好意!
解决方法
由于sum(treatment) > 0
的长度为1,ifelse()
仅返回第一个数字并将其循环使用到当前组的长度。在这种情况下,if() ... else ...
是合适的。
library(dplyr)
df %>%
group_by(id) %>%
mutate(relative_time = if(sum(treatment) > 0) seq_along(treatment) - which(treatment == 1) else NA)
# # A tibble: 7 x 3
# # Groups: id [2]
# id treatment relative_time
# <dbl> <dbl> <int>
# 1 1 0 -2
# 2 1 0 -1
# 3 1 1 0
# 4 1 0 1
# 5 2 0 NA
# 6 2 0 NA
# 7 2 0 NA
,
我们可以使用match
进行此操作。按“ id”分组后,在“处理”中将row_number
减去行索引,其中行值为1。默认情况下,如果没有match
,它将返回NA
,并且使用NA
进行的任何算术运算都将产生NA
library(dplyr)
df %>%
group_by(id) %>%
mutate(relative_time = row_number() - match(1,treatment))
# A tibble: 7 x 3
# Groups: id [2]
# id treatment relative_time
# <dbl> <dbl> <int>
#1 1 0 -2
#2 1 0 -1
#3 1 1 0
#4 1 0 1
#5 2 0 NA
#6 2 0 NA
#7 2 0 NA
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。