R 是否可能仅在选定的组内发生变异?

R 是否可能仅在选定的组内发生变异?,r,group-by,dplyr,mutate,R,Group By,Dplyr,Mutate,我想知道是否可以使用mutate将函数仅应用于选定的组(而不是观察!) 我有多个变量来指示一个对象是否在给定的时间点暴露于特定类型的处理 df <- data.frame(id = c(1,1,1,1,2,2,2), treatment = c(0,0,1,0,0,1,0)) 由于我有很多这样的处理,我希望避免为每种处理类型过滤和创建多个数据帧,而是使用mutate\u at() 我将非常感谢你的忠告 因为sum(treatment)>0的长度为1,ifelse()只返回第一个数字,并将

我想知道是否可以使用
mutate
将函数仅应用于选定的组(而不是观察!)

我有多个变量来指示一个对象是否在给定的时间点暴露于特定类型的处理

df <- data.frame(id = c(1,1,1,1,2,2,2), treatment = c(0,0,1,0,0,1,0))
由于我有很多这样的处理,我希望避免为每种处理类型过滤和创建多个数据帧,而是使用
mutate\u at()

我将非常感谢你的忠告

因为
sum(treatment)>0
的长度为1,
ifelse()
只返回第一个数字,并将其循环到当前组的长度。在本例中,
if()。。。否则…
是合适的

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
库(dplyr)
df%>%
分组依据(id)%>%
变异(相对时间=if(总和(治疗)>0)顺(治疗)–哪个(治疗==1)其他NA)
##tibble:7 x 3
##组:id[2]
#id治疗相对时间
#                 
# 1     1         0            -2
# 2     1         0            -1
# 3     1         1             0
# 4     1         0             1
#520NA
#620NA
#720 NA

我们可以通过
匹配来实现这一点。按“id”分组后,用“治疗”中的值为1的行索引减去
行编号
。默认情况下,如果没有
匹配
,它将返回
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
库(dplyr)
df%>%
分组依据(id)%>%
变异(相对时间=行数()-匹配(1,治疗))
#一个tibble:7x3
#组别:id[2]
#id治疗相对时间
#                
#1     1         0            -2
#2     1         0            -1
#3     1         1             0
#4     1         0             1
#520NA
#620NA
#720 NA

亲爱的达伦,谢谢你的回答!然而,在我的情况下,它不知何故不起作用:对于未治疗组,结果只是
seq_沿着
的输出…@Asikaz你能给我一个例子吗?也许
group_by(id,treatment)
?似乎问题出在R版本或其他版本中:它在我的笔记本电脑上工作得很好,但在我的办公室电脑上却不工作。再次感谢您!亲爱的akrun,感谢您提供了这个简短而方便的解决方案!
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
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
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