基于上一列的值开始列的行值-R

问题描述

我的数据框如下:

memory_resource

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

我希望得到以下结果:

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