基于前一列值的起始列行值 - R

starting column row values based on previous column value - R

我有一个数据框如下:

xR <- data.frame("A" = c(15, 13.5, 12, 9.1, NA, NA, NA, NA), 
         "B" = c(NA, 13.6, 8.4, 6.7, 5.6, 2.0, NA, NA), 
         "C" = c(NA, NA, 8.5, 2.43, 1.23, NA, NA, NA))

是否可以移动 Col B 中的值,使其从 Col A 的同一行开始,其中 Col B 的第一个值低于 Col A 中对应的行值。 移动 Col C 中的值,使其从 Col B 的同一行开始,其中 Col C 的第一个值低于 Col B 中的相应行值,对于我的数据框中的每一列,依此类推。我的数据框有比这更多的列,所以需要尝试自动化它。

我希望得到以下结果:

xR1 <- data.frame("A" = c(15, 13.5, 12, 9.1, NA, NA, NA, NA), 
             "B" = c(13.6, 8.4, 6.7, 5.6, 2.0, NA, NA, NA), 
             "C" = c(NA, 8.5, 2.43, 1.23, NA,NA, NA, NA))

谢谢

这是一种方法。在每列中:

首先,确定第一个非 NA 位置。

其次,确定要将第一个非 NA 位置移动到的新位置。这将是第一个非 NA 位置的值小于上一列中的值的最小值。

第三,将该列的向量移动新位置与第一个非 NA 位置之间的差值。

for (i in 2:ncol(xR)) {
  first_non_NA_position <- which.min(is.na(xR[[i]]))
  new_position <- min(which(xR[[i]][first_non_NA_position] < xR[[i-1]]))
  position_diff <- first_non_NA_position - new_position
  if (position_diff > 0) {
    xR[[i]] <- c(tail(xR[[i]], -position_diff), rep(NA, position_diff))
  }
}

输出

     A    B    C
1 15.0 13.6 8.50
2 13.5  8.4 2.43
3 12.0  6.7 1.23
4  9.1  5.6   NA
5   NA  2.0   NA
6   NA   NA   NA
7   NA   NA   NA
8   NA   NA   NA