问题描述
我的数据框如下:
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