Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将前导NA细胞向左移动,但不将R中的内部NAs移动_R_Dplyr_Na_Zoo - Fatal编程技术网

将前导NA细胞向左移动,但不将R中的内部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

作为前言,我注意到,对于一个类似的问题,“我如何将非NA细胞向左移动”至少有5个答案。关于这一点,有很多很好的答案,而zoo包中有一个NA.locf()做得很好

我的特别问题是,我想将单元格向左移动到最后一个前导NA的右侧,替换所有前导NAs。这意味着我需要保留“内部”和后续NAs。下面是一个矩阵的小示例,但我的实际数据是一个大数据帧:

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))