将值从先前的匹配行复制到新的匹配行

时间:2019-05-28 12:16:13

标签: r for-loop

我的示例数据框的构造如下:

ID       <- c("1", "2", "1", "2", "1", "2")
Current  <- c(1.12, NA, 3.66, 8.95, 4.73, 7.82)
Previous <- c(NA, NA, NA, NA, NA, NA)
df       <- data.frame(ID, Current, Previous, stringsAsFactors = TRUE)

通过写入IDlevels(df$ID)添加额外的levels(df$ID) <- c(levels(df$ID), "3")会导致:

> levels(df$ID)
[1] "1" "2" "3"

(我要添加一个额外的级别,因为当前正在使用的数据帧包含很多甚至一次都不会出现的级别。)

现在可以打印df

  ID Current Previous
1  1    1.12       NA
2  2      NA       NA
3  1    3.66       NA
4  2    8.95       NA
5  1    4.73       NA
6  2    7.82       NA

由于typeof(df$Current)"double",而typeof(df$Previous)"logical",我想将Previous列转换为"double"。为了实现这一点,我写:

df$Previous <- as.numeric(as.character(df$Previous))

现在写typeof(df$Previous)会得到"double"

我现在要执行以下操作:取ID 1的第一个Current条目并将其复制到ID 1的第二个Previous条目,依此类推如果Current的值不是NA。也就是说,结果表应如下所示:

  ID Current Previous
1  1    1.12       NA
2  2      NA       NA
3  1    3.66     1.12
4  2    8.95       NA
5  1    4.73     3.66
6  2    7.82     8.95

我已经通过编写以下for循环来尝试执行此操作,但是它没有用,并且我不知道自己做错了什么:

i = 1
for(i in length(unique(df$ID))) {
  j = 1
  k = 1
  idLocationAbsolute = 1
  for(j in length(df$ID)) {
    if(unique(df$ID)[i] == df$ID[j]) {
      idLocationAbsolute[k] = j
      k = k + 1
    }
  }
  if(k > 1) {
    k = k - 1
    l = 1
    for(l in k) {
      if(!is.na(idLocationAbsolute[l])) {
        df$Previous[l + 1] = df$Current[l]
      }
    }
  }
}

请注意,我写了idLocationAbsolute = 1,因为R否则会打印一条错误消息。但是我不能说这是一件好事,还是只是破坏了整个代码。但是,我认为这不是代码未按应做的原因。

0 个答案:

没有答案