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

时间:2015-10-27 10:29:00

标签: r dataframe row

我想在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执行此操作。

你们中有谁知道这样做的聪明方法吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果使用此实用程序功能,则可以添加要描述的行。一般过程是

  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(.))
    

答案 1 :(得分:1)

使用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