删除前导NA以对齐数据

nde*_*763 13 r dataframe

我有一个很大data.frame的'交错'数据,并希望对齐它.我的意思是我想采取类似的东西

在此输入图像描述

并从所有列中删除前导(顶部)NA以获取

在此输入图像描述

我知道包中的na.trim函数zoo,但是这不适用于data.frame上面提到的初始函数或它的转置.为此,我使用了转置数据帧t.df,

t.df <- na.trim(t.df, sides = 'left')
Run Code Online (Sandbox Code Playgroud)

这只返回一个空的data.frame,并且不会以我想要的方式工作,因为它会创建不同长度的向量.任何人都可以指向一个可能更有帮助的包或功能吗?

以下是我上面使用的示例的代码:

# example of what I have

var1 <- c(1,2,3,4,5,6,7,8,9,10)
var2 <- c(6,2,4,7,3,NA,NA,NA,NA,NA)
var3 <- c(NA,NA,8,6,3,7,NA,NA,NA,NA)
var4 <- c(NA,NA,NA,NA,5,NA,2,6,2,9)

df <- data.frame(var1, var2, var3, var4)


# transpose and (unsuccessful) attempt to remove leading NAs

t.df <- t(df)

t.df <-  na.trim(t.df, sides = 'left')
Run Code Online (Sandbox Code Playgroud)

akr*_*run 11

我们可以循环遍历列(lapply(..)并应用na.trim.然后,list通过lengthlist元素中指定最大长度,在每个元素的末尾填充NA .

library(zoo)
lst <- lapply(df, na.trim)
df[] <- lapply(lst, `length<-`, max(lengths(lst)))
df
#   var1 var2 var3 var4
#1     1    6    8    5
#2     2    2    6   NA
##     3    4    3    2
#4     4    7    7    6
#5     5    3   NA    2
#6     6   NA   NA    9
#7     7   NA   NA   NA
#8     8   NA   NA   NA
#9     9   NA   NA   NA
#10   10   NA   NA   NA
Run Code Online (Sandbox Code Playgroud)

或者正如@ G.Grothendieck在评论中提到的那样

replace(df, TRUE, do.call("merge", lapply(lst, zoo)))
Run Code Online (Sandbox Code Playgroud)

  • 这也可以代替最后一行:`replace(df,TRUE,do.call("merge",lapply(lst,zoo))) (2认同)