将hist应用于包含NA的数据帧列表

时间:2013-08-01 12:50:32

标签: r histogram lapply

关于列表语法的另一个问题(我想我正在慢慢学习)。我有以下简化形式的数据:

a=c(1,2,3,4,5,NA,NA)
b=c(6,7,8,9,10,NA,NA)
c=c(6,5,3,NA,NA,NA,NA)
d=c(NA,NA,NA,NA,NA,NA,NA)
A=data.frame(a,b,c,d)
B=data.frame(c,b,a,d)
C=data.frame(d,c,b,a)
mylist=list(A,B,C)
bins=c(0,2,4,6,8,10)

我想根据定义的bin来对数据帧列表中的每一列进行bin,然后为每个数据帧返回每个bin的平均数。我不介意输出的形式,数据帧或向量列表。因此在这个例子中:

hist(a,bins, plot= FALSE)
hist(b,bins, plot= FALSE)
hist(c,bins, plot= FALSE)

计算

$counts
[1] 2 2 1 0 0
$counts
[1] 0 0 1 2 2
$counts
[1] 0 1 2 0 0

分别

我不知道怎么做但是假设d只包含NA,我希望它返回:

$counts
[1] 0 0 0 0 0

(我想把每个NA变成0)。

因此,A(包含a,b,c,d)的平均值为:

$counts
[1] 2 2 1 0 0 +
$counts
[1] 0 0 1 2 2 +
$counts
[1] 0 1 2 0 0 +
$counts
[1] 0 0 0 0 0 +

=   2 3 4 2 2 / 4

=   0.5 0.75 1 0.5 0.5

这将是我对数据帧A的期望输出。最终的向量列表还将包括B和C的相关向量,尽管正如我所说的那样,初始列表中每个数据帧的列的数据帧也会很好,因为最后一步我将把这些平均数计算在垃圾箱的中点。

我希望我的解释足以让我知道我想要做什么。

1 个答案:

答案 0 :(得分:2)

正如我在评论中指出的那样,制作d数字将解决您正在排除故障的简单情况。要获得您想要在整个数据框中计算的方法,请使用apply,然后选择一些rowMeans

rowMeans(apply(A,2,function(a) hist(a,bins,plot=FALSE)$counts))
#[1] 0.50 0.75 1.00 0.50 0.50

要为数据框列表执行此操作,只需将其嵌套在lapply(或sapply)中:

> lapply(mylist,function(X)
      rowMeans(apply(X,2,function(a) hist(a,bins,plot=FALSE)$counts)))
[[1]]
[1] 0.50 0.75 1.00 0.50 0.50

[[2]]
[1] 0.50 0.75 1.00 0.50 0.50

[[3]]
[1] 0.50 0.75 1.00 0.50 0.50

(注意:显然你的dfs都会产生相同的输出,所以看起来它看起来不正常但实际上是。)