【问题标题】:Created a new column with some rules in R在 R 中创建了一个包含一些规则的新列
【发布时间】:2017-08-03 14:39:15
【问题描述】:

我拥有的数据包含三个具有三个唯一 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)。

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

例如,对于 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)

【问题讨论】:

  • 也许我不明白,但对于第 2 部分,您的意思是 updated_y0(1,2) = updated_y0(1,1) - z(1,1) 吗?而不仅仅是updated_y0(1,2) = y(1,1) - z(1,1)
  • 是的。这意味着对于每个 id 并从第二行开始,updated_y0 是前一个 y 和 z 之间的差异。谢谢
  • 是的,我的问题是您希望它是y-z 还是previous_y0 - z。您提供的示例,updated_y0(1,3) 上面没有1 - 0
  • 对不起,你是对的。它应该是previous_y0 - z。
  • 我更新了问题中的 updated_y0 值。

标签: r


【解决方案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 的第二条记录,则它会根据它上面的行(dplyr::lag)计算y-z

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多