我真的觉得这个问题的答案应该在网络的某个地方,但我无法找到它。如果您找到解释它的主题/网站,请重定向我。
我的问题:我想将一个函数应用于数据框中的每一行并返回一个数据框,但是apply会给我一个列表,因为我的结果长度是变化的。
我的例子:我需要在数据帧中以行方式插入NA。动物园中的na.approx可以很容易地按列进行插值,但是我想按行进行插值。
> df <- data.frame(C1=c(1,2,NA),C2=c(2,NA,5),C3=c(NA,7,8))
> na.approx(df)
C1 C2 C3
[1,] 1 2.0 NA
[2,] 2 3.5 7
[3,] NA 5.0 8
我希望中间的3.5为4.5:2和7的平均值,而不是2和5.所以我可以这样做:
> t(na.approx(t(df)))
[,1] [,2] [,3]
[1,] 1 2.0 NA
[2,] 2 4.5 7
[3,] NA 5.0 8
那没关系,但为了学习apply和plyr,我想用这些来实现相同的结果。然而,结果不是我想要的:
> apply(df,1,function(x){na.approx(x)})
[[1]]
[1] 1 2
[[2]]
[1] 2.0 4.5 7.0
[[3]]
[1] 5 8
它给了我一个列表..如果我在第一行和最后一行中没有NA的data.frame,那么它工作正常:
> df.2 <- data.frame(C1=c(1,2,3),C2=c(2,NA,5),C3=c(4,7,8))
> apply(df.2,1,function(x){na.approx(x)})
[,1] [,2] [,3]
[1,] 1 2.0 3
[2,] 2 4.5 5
[3,] 4 7.0 8
我认为这是预期的,并且应用文档说的是: &#34;如果对FUN的调用返回不同长度的向量,则apply返回长度为prod(dim(X)[MARGIN])的列表,如果长度大于1,则将dim设置为MARGIN。&#34;
但如果我真的想要一个数据框,我该怎么办?我想学习普利尔,但是aaply也不起作用(出于同样的原因,我假设)
> aaply(df,1,function(x){na.approx(x)})
Error: Results must have the same dimensions.
谢谢。
阿尔弗雷德
答案 0 :(得分:1)
使用 na.rm = FALSE。或 na.rm = F
apply(df,1,function(x){na.approx(x, na.rm=FALSE)})
请参阅zoo package了解更多详情
答案 1 :(得分:0)
尝试na.rm=FALSE
:
> apply(df,1,function(x){na.approx(x,na.rm = F)})
[,1] [,2] [,3]
[1,] 1 2.0 NA
[2,] 2 4.5 5
[3,] NA 7.0 8