R为数据框中的每个主题创建新行

R Creating new row for every subject in the data frame

我想在 TIME=0 为每个主题 (ID) 插入一个额外的行。

添加的行应包含相同的列值,但 A 和 B 除外,对于所有主题应将其更改为 2 和 -2。每个主题的所有其他列值应保持不变。下面的例子说明了我想为一个主题做些什么:

ID = c(1,1,1,1)
TIME = c(0,1, 2,3)
CONC= c(0,6,12,9)
A= c(1,2,2,2)
B=c(0,0,0,0)
C=c(1,0,0,0)
DF1 = data.frame(ID, TIME, CONC, A, B,C) 


#add row for every new ID with A now = 2 and B = -2. All other columns must remain the same.
ID = c(1,1,1,1,1)
TIME = c(0,0,1, 2,3)
CONC= c(0,0,6,12,9)
A= c(1,2,2,2,2)
B=c(0,-2,0,0,0)
C=c(1,1,0,0,0)
DF2 = data.frame(ID, TIME, CONC, A, B,C) 

该过程应对数据框中的所有 ID 执行此操作。

你们知道做这件事的聪明方法吗?任何帮助将不胜感激。

如果您使用这个实用函数,您可以添加您正在描述的行。大体流程是

  1. 提取 TIME == 0 所在的行。
  2. 将新行添加到该子集的末尾
  3. 填写缺失值
  4. 将结果绑定到 TIME != 0.
  5. 所在的行

library(dplyr)
insertRow0 <- function(D){
  id <- D$ID[1]

  bind_rows(filter(D, TIME == 0),
            data_frame(ID = id,
                       TIME = 0,
                       A = 2,
                       B = -2)) %>%
    zoo::na.locf() %>%
    bind_rows(filter(D, TIME != 0))
}

运行通过这个对于每个ID就那么简单

DF1 %>%
  group_by(ID) %>%
  do(insertRow0(.))

dplyr

可以很简单
library(dplyr)
DF1 %>% 
  filter(TIME == 0) %>% # select everything at TIME = 0
  mutate(A = 2, B = -2) %>% # replace A with 2 and B with -2
  bind_rows(DF1) # append the original data