首页 > 解决方案 > 将前一个匹配行的值复制到新的匹配行

问题描述

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

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)

通过写入ID结果添加额外内容:levels(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)is"double"typeof(df$Previous)is "logical",我想将该Previous列转换为"double". 为了实现这一点,我写:

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

现在写入typeof(df$Previous)会导致"double".

我现在想做ID 1以下事情:如果值不是. 也就是说,结果表应如下所示:CurrentID 1PreviousCurrentNA

  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 会打印错误消息。但我无法判断这是否是一件好事,或者它是否只是破坏了整个代码。然而,我认为这不是代码没有做它应该做的事情的原因。

标签: rfor-loop

解决方案


推荐阅读