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 执行此操作。
你们知道做这件事的聪明方法吗?任何帮助将不胜感激。
如果您使用这个实用函数,您可以添加您正在描述的行。大体流程是
- 提取
TIME == 0
所在的行。
- 将新行添加到该子集的末尾
- 填写缺失值
- 将结果绑定到
TIME != 0
. 所在的行
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
我想在 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 执行此操作。
你们知道做这件事的聪明方法吗?任何帮助将不胜感激。
如果您使用这个实用函数,您可以添加您正在描述的行。大体流程是
- 提取
TIME == 0
所在的行。 - 将新行添加到该子集的末尾
- 填写缺失值
- 将结果绑定到
TIME != 0
. 所在的行
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