在R中创建了一个包含一些规则的新列

时间:2017-08-03 14:39:16

标签: r

我的数据包含三个具有三个唯一ID的变量,每个变量都有多个记录。见下文

ID <- c(rep(1,7), rep(2,6), rep(3,5))
t <- c(seq(1,7), seq(1,6), seq(1,5))
y <- c(rep(6,7), rep(1,6), rep(6,5))
z <- c(5,0,0,0,1,0,0,0,0,1,0,0,0,4,2,1,0,1)
dat1 <- data.frame(ID, t, y, z)

我需要使用以下规则创建一个新列(让我们称之为updated_y0):

  1. 对于每个ID i = 1,2,3和每个记录j,updated_y0(i,1)(即,由t排序的每个ID的第一个记录)= y(i,1)。 / p>

  2. updated_y0(i,j),其中j> 1(即,从第二条记录开始)= updated_y0(i,j-1) - z(i,j-1)(前一行的差异)

  3. 例如,对于ID = 1,

    • updated_y0(1,1)= y(1,1)= 6,

    • updated_y0(1,2)= updated_y0(1,1) - z(1,1)= 6-5 = 1,

    • updated_y0(1,3)= updated_y0(1,2) - z(1,2)= 1-0 = 1 ...

    新数据(dat2)

        ID <- c(rep(1,7), rep(2,6), rep(3,5))
        t <- c(seq(1,7), seq(1,6), seq(1,5))
        y <- c(rep(6,7), rep(1,6), rep(6,5))
        z <- c(5,0,0,0,1,0,0,0,0,1,0,0,0,4,2,1,0,1)
      updated_y0 <- c(6,1,1,1,1,0,0,1,1,1,0,0,0,6,2,0,-1,-2)
    
    dat2 <- data.frame(ID, t, y, z, updated_y0)
    

1 个答案:

答案 0 :(得分:1)

这应该有效,尽管我讨厌使用for循环。首先,我们确定每个ID的所有首批记录(所有其他记录将标记为NA):

library(dplyr)

dat2 <- dat1 %>% 
  group_by(ID) %>% 
  mutate(updated_y0 = ifelse(t == 1,
                            y,
                            NA))

现在我们使用for循环来替换NAs

for(i in 1:nrow(dat2)){
  dat2$updated_y0[i] <- ifelse(is.na(dat2$updated_y0[i]),
                               dat2$updated_y0[i-1] - dat2$z[i-1],
                               dat2$updated_y0[i])
    }

dat2

对于滞后y-z选项的示例,您可以非常简单地使用dplyr选项:

dat1 %>% 
  group_by(ID) %>% 
  mutate(updated_y0 = ifelse(t == 1,
                            y,
                            lag(y - z)))

ifelse只要是第一条记录(y),就会提供当前t值。如果它不是ID的第二条记录,则会根据其上方的行(y-z)计算dplyr::lag