将前导NA细胞向左移动,但不将R中的内部NAs移动
作为前言,我注意到,对于一个类似的问题,“我如何将非NA细胞向左移动”至少有5个答案。关于这一点,有很多很好的答案,而zoo包中有一个NA.locf()做得很好 我的特别问题是,我想将单元格向左移动到最后一个前导NA的右侧,替换所有前导NAs。这意味着我需要保留“内部”和后续NAs。下面是一个矩阵的小示例,但我的实际数据是一个大数据帧:将前导NA细胞向左移动,但不将R中的内部NAs移动,r,dplyr,na,zoo,R,Dplyr,Na,Zoo,作为前言,我注意到,对于一个类似的问题,“我如何将非NA细胞向左移动”至少有5个答案。关于这一点,有很多很好的答案,而zoo包中有一个NA.locf()做得很好 我的特别问题是,我想将单元格向左移动到最后一个前导NA的右侧,替换所有前导NAs。这意味着我需要保留“内部”和后续NAs。下面是一个矩阵的小示例,但我的实际数据是一个大数据帧: matrixtest[1, 1:3] <- NA matrixtest[3, 1:2] <- NA matrixtest[2, 3] <- N
matrixtest[1, 1:3] <- NA
matrixtest[3, 1:2] <- NA
matrixtest[2, 3] <- NA
matrixtest[4, 2] <- NA
matrixtest
matrixresult <-matrix(4, ncol = 4, nrow = 4)
matrixresult[1, 2:4] <- NA
matrixresult[3, 3:4] <- NA
matrixresult[2, 3] <- NA
matrixresult[4, 2] <- NA
matrixresult
如果我已经错过了一个合适的答案,请道歉。我在这个看似简单的问题上花费了太多的时间。我们基于最后一列创建了一个索引,并对这些行进行了修改
i1 <- is.na(matrixresult[, ncol(matrixresult)])
matrixresult[i1, ] <- t(apply(matrixresult[i1,], 1, rev))
1)shiftLeft
使用na从输入x
的末端移除NAs。trim
给出y
,然后用它覆盖NAs向量的开头apply
将其应用于每一行,并将其转置,因为apply
会导致我们想要的内容的转置
library(zoo)
shiftLeft <- function(x, y = na.trim(x)) replace(NA * x, seq_along(y), y)
m <- t(apply(matrixtest, 1, shiftLeft))
# check
identical(m, matrixresult)
## [1] TRUE
图书馆(动物园)
shiftLeft你能再详细说明一下你的例子是如何工作的吗?列1:4代表一年中的四分之一。我试图将每个人的测量值与他们测量的第一、第二、第三等时间对齐,而不是按日历对齐<对不起,我不太清楚这次降价。但是,如果使用适当的换行符运行上述代码以使其可读,则会得到一个与上面名为matrixtest
的矩阵不同的矩阵。我想我解释得很清楚,但如果我能进一步帮助你,请告诉我。
matrixresult
# [,1] [,2] [,3] [,4]
#[1,] NA NA NA 4
#[2,] 4 4 NA 4
#[3,] NA NA 4 4
#[4,] 4 NA 4 4
library(zoo)
shiftLeft <- function(x, y = na.trim(x)) replace(NA * x, seq_along(y), y)
m <- t(apply(matrixtest, 1, shiftLeft))
# check
identical(m, matrixresult)
## [1] TRUE
shiftLeft2 <- function(x) {
ix <- which.max(!is.na(x))
replace(NA*x, seq_len(length(x) - ix + 1), x[ix:length(x)])
}
m2 <- t(apply(matrixtest, 1, shiftLeft2))
matrixtest <- structure(c(NA, 4, NA, 4, NA, 4, NA, NA, NA, NA, 4, 4, 4, 4,
4, 4), .Dim = c(4L, 4L))
matrixresult <- structure(c(4, 4, 4, 4, NA, 4, 4, NA, NA, NA, NA, 4, NA, 4, NA,
4), .Dim = c(4L, 4L))