R 从现有行和列中的值创建新变量

R 从现有行和列中的值创建新变量,r,dplyr,mutate,R,Dplyr,Mutate,我想创建一个名为change\u index的新变量。此变量是时间3的结果1-时间1的结果1/时间1的结果1 我该怎么做呢?我试着做了以下几件事 outcome1t0 <- data %>% filter(time == "1") %>% select(outcome1) outcome1t12 <- data %>% filter(time == "3") %>% select(outcome1) data$newvariable <- (outc

我想创建一个名为change\u index的新变量。此变量是时间3的结果1-时间1的结果1/时间1的结果1

我该怎么做呢?我试着做了以下几件事

outcome1t0 <- data %>%
filter(time == "1") %>%
select(outcome1)

outcome1t12 <- data %>%
filter(time == "3") %>%
select(outcome1)

data$newvariable <- (outcome1t0 - outcome1t12) / outcome1t0
编辑1

按照下面的建议尝试了以下操作,我根据自己的数据更改了名称

ancestral1 %>%
group_by(subject) %>% 
mutate(bicep0 = bicep[time == 0],
     bicep12 = bicep[time == 12], 
     bicepind = (bicep12 - bicep0) / bicep12)
我得到以下错误

Error in `$<-.data.frame`(`*tmp*`, bicind, value = list(bicep = c(13.3591525423729,  : 
replacement has 20 rows, data has 60
Error in mutate_impl(.data, dots) : 
Column `bicep0` must be length 1 (the group size), not 0
编辑2

尝试了新的建议,仍然是同样的错误

ancestral1 %>% 
group_by(subject) %>% 
mutate(bicep0 = if(any(time == 5)) bicep[time == 5] else NA, 
     bicep12 = bicep[time == 3], 
     bicepind = (bicep0 - bicep12) / bicep0)

Error in mutate_impl(.data, dots) : 
Column `bicep12` must be length 1 (the group size), not 0
我们不做过滤,而是创建新的变量

data %>%
  group_by(subject) %>% 
  mutate(outcome1t0 = outcome1[time == 1],
       outcome1t2 = outcome1[time == 3], 
       newvariable = (outcome1t0 - outcome1t2) / outcome1t0) %>%
  select(-outcome1t0, -outcome1t2)
# A tibble: 6 x 6
# Groups:   subject [2]
#  subject treatment  time outcome1 outcome2 newvariable
#    <int> <chr>     <int>    <int>    <int>       <dbl>
#1       1 a             1       80       15       0.075
#2       1 a             2       75       14       0.075
#3       1 a             3       74       12       0.075
#4       2 b             1       90       16       0.156
#5       2 b             2       81       15       0.156
#6       2 b             3       76       15       0.156

出现错误的原因是,当您进行筛选时,两个对象的行数不同。在您显示的示例中,两个“主题”都有1和3。如果不是这样,就会导致错误。您可能需要更改示例,并在这种情况下显示预期输出。谢谢,在我的数据集中,所有受试者仅在0、6、12周时有结果。大约有40个科目。我不确定出了什么问题。请检查代码数据%>%groupbysubject%>%mutateoutcome1t0=ifanytime==5 outcome1[time==5]否则NA,outcome1t2=outcome1[time==3],newvariable=outcome1t0-outcome1t2/outcome1t0hanks,我尝试过,相同的错误。我已经更新了主帖子。谢谢@akrun。我尝试过这样做,但出现了一个错误。我已经更新了我的主要帖子以显示错误。@DiscoR如果每个“主题”只有唯一的时间值,它应该work@DiscoR创建一个if/else条件,例如没有时间5。如果我使用数据%>%groupbysubject%>%mutateoutcome1t0=ifanytime==5 outcome1[time==5],否则NA,outcome1t2=outcome1[time==3],newvariable=outcome1t0-outcome1t2/outcome1t0好的,非常感谢。我认为它奏效了。不过,在我从环境中提取的数据框架中,我没有看到新的变量。如何创建此新列并将其保存到环境中的数据帧?@DiscoR您可能应该使用first/last而不是硬编码时间,例如DT%>%group\u bysubject%>%SummarseChange=if n==1 NA\u real\u else LastOutcome 1-FirstOutcome 1/FirstOutcome我想如果你试图以这种方式处理多个结果,可能会有一些总结或变异
data %>%
  group_by(subject) %>% 
  mutate(outcome1t0 = outcome1[time == 1],
       outcome1t2 = outcome1[time == 3], 
       newvariable = (outcome1t0 - outcome1t2) / outcome1t0) %>%
  select(-outcome1t0, -outcome1t2)
# A tibble: 6 x 6
# Groups:   subject [2]
#  subject treatment  time outcome1 outcome2 newvariable
#    <int> <chr>     <int>    <int>    <int>       <dbl>
#1       1 a             1       80       15       0.075
#2       1 a             2       75       14       0.075
#3       1 a             3       74       12       0.075
#4       2 b             1       90       16       0.156
#5       2 b             2       81       15       0.156
#6       2 b             3       76       15       0.156