1

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

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)

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

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 的相关向量,尽管正如我所说,初始列表中每个数据帧的列数据帧也可以,因为最后一步将是我将这些平均数与 bin 的中点进行比较。

我希望我的解释足以让我对我正在尝试做的事情有所了解。

4

1 回答 1

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 都产生相同的输出,所以这看起来它不能正常工作,但实际上是。)

于 2013-08-01T13:24:20.650 回答