2013-08-01 38 views
1

有关列表语法的另一个问题(我正在慢慢学习,我认为)。我在以下简化形式数据:将hist应用于包含NA的数据框列表

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) 

我想根据定义的二进制位在dataframes列表仓的每个列,然后返回一个平均数各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,尽管正如我所说,初始列表中每个数据帧的列的数据框也没有问题,因为最后一步是我将这些平均值计算在箱的中点上。

我希望我的解释足以说明我正在尝试做什么。

+0

制作'd'数字:'d < - as.numeric(d) '它应该工作。 – Thomas

+0

嗨托马斯,谢谢你。在更简单的情况下,我想忽略包含所有NA(如d)的数据框列表中的列,我该如何处理数据并获取平均值? – user1912925

回答

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 

要为dataframes名单做,只是其嵌套在一个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都产生相同的输出,所以这看起来像是无法正常工作,但它实际上是。)

+0

+1不错的工作,这看起来像OP想要什么 –

+0

嗨,托马斯,谢谢你的答案,但我怎么能应用这个mylist(包含数据框B和C以及A​​的列表)? – user1912925

+0

@ user1912925查看编辑 – Thomas

相关问题