是否可以仅在选定的组内进行突变?

问题描述

我想知道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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...