关于列表语法的另一个问题(我想我正在慢慢学习)。我有以下简化形式的数据:
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的相关向量,尽管正如我所说的那样,初始列表中每个数据帧的列的数据帧也会很好,因为最后一步我将把这些平均数计算在垃圾箱的中点。
我希望我的解释足以让我知道我想要做什么。
答案 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都会产生相同的输出,所以看起来它看起来不正常但实际上是。)