从apply返回数据框,即使结果长度不同

时间:2016-10-28 09:04:56

标签: r apply plyr zoo

我真的觉得这个问题的答案应该在网络的某个地方,但我无法找到它。如果您找到解释它的主题/网站,请重定向我。

我的问题:我想将一个函数应用于数据框中的每一行并返回一个数据框,但是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.

谢谢。

阿尔弗雷德

2 个答案:

答案 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