我有一个很大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
通过length
从list
元素中指定最大长度,在每个元素的末尾填充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)