我有一个data.frames列表,如下所示:
df=data.frame(
data_id=rep(LETTERS[1:10],each=1),
data_value=c(1,2,2,3,3,2,3,1,1,3))
df2=data.frame(
data_id=rep(LETTERS[1:10],each=1),
data_value=c(2,1,3,1,1,1,2,1,2,1))
df3=data.frame(
data_id=rep(LETTERS[1:10],each=1),
data_value=c(2,2,3,3,1,2,2,1,2,3))
df.list <- list(df, df2, df3)
单个data.frame看起来像这样:
data_id data_value
1 A 1
2 B 2
3 C 2
4 D 3
5 E 3
6 F 2
7 G 3
8 H 1
9 I 1
10 J 3
我想要计算每个唯一值在data_value中出现的频率。我可以这样做:
for(i in 1:length(df.list)){
daply(df.list[[i]], .(df.list[[i]]$data_value), nrow) -> freq
}
这给了我频率计数(在这种情况下只是最后一个,对于df3):
1 2 3
2 5 3
我的实际数据集要大得多,所以我不能在这里发布。然而,它具有完全相同的结构。问题是,当我尝试获取实际数据集的频率计数时,我收到以下错误消息:
Error in dim(out_array) <- out_dim : dims [product 0] do not match the length of object [1]
有谁能告诉我在哪里需要开始寻找解决方法?我不明白'dim()'在哪里以及它做了什么。非常感谢。
答案 0 :(得分:5)
通过用laply
替换for循环,你实际上可以做得更好,这意味着输入是一个列表,输出是一个矩阵/数组。
o <- laply(df.list, function(x) {
table(x$data_value)
})
> o
# 1 2 3
# [1,] 3 3 4
# [2,] 6 3 1
# [3,] 2 5 3
为了检查错误原因,尝试此操作会发生什么?
o <- llply(df.list, function(x) {
table(x$data_value)
})
修改:为了使错误更容易理解,让我们创建一下这个data.frame:
d1 <- data.frame(a=1:4)
d2 <- data.frame(a=1:5)
d3 <- data.frame(a=1:6)
d4 <- data.frame(a=1:7)
dl <- list(d1,d2,d3,d4)
现在运行laply
:
laply(dl, function(x) table(x$a))
# Error: Results must have the same dimensions.
为什么呢?为了看到这一点,让我们打印出来:
> laply(dl, function(x) print(table(x$a)))
# 1 2 3 4
# 1 1 1 1
#
# 1 2 3 4 5
# 1 1 1 1 1
#
# 1 2 3 4 5 6
# 1 1 1 1 1 1
#
# 1 2 3 4 5 6 7
# 1 1 1 1 1 1 1
# Error: Results must have the same dimensions.
你看到了问题吗?每行中的元素数量不同。你不能有一个矩阵(除非你附加较小元素的那些与行相等)。
相反,请使用列表,使它们成为列表的元素,以后可以使用[[number]]
语法访问它们。
llply(dl, function(x) table(x$a))
# [[1]]
#
# 1 2 3 4
# 1 1 1 1
#
# [[2]]
#
# 1 2 3 4 5
# 1 1 1 1 1
#
# [[3]]
#
# 1 2 3 4 5 6
# 1 1 1 1 1 1
#
# [[4]]
#
# 1 2 3 4 5 6 7
# 1 1 1 1 1 1 1
希望这可以解决问题。