当使用daply进行频率计数时,"dims [product 0]与对象的长度不匹配"R中的错误

Ann*_*rie 1 r frequency plyr dataframe

我有一个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)
Run Code Online (Sandbox Code Playgroud)

单个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
Run Code Online (Sandbox Code Playgroud)

我想要计算每个唯一值出现在data_value中的频率.我可以做这个:

for(i in 1:length(df.list)){
    daply(df.list[[i]], .(df.list[[i]]$data_value), nrow) -> freq
}
Run Code Online (Sandbox Code Playgroud)

这给了我频率计数(在这种情况下只是最后一个,对于df3):

1 2 3 
2 5 3 
Run Code Online (Sandbox Code Playgroud)

我的实际数据集要大得多,所以我不能在这里发布.然而,它具有完全相同的结构.问题是,当我尝试获取实际数据集的频率计数时,我收到以下错误消息:

Error in dim(out_array) <- out_dim : dims [product 0] do not match the length of object [1]
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我在哪里开始寻找解决这个问题的方法吗?我不明白'dim()'在哪里以及它做了什么.非常感谢.

Aru*_*run 7

通过用a替换for循环,你实际上可以做得更好laply,这意味着输入是一个列表,输出是一个矩阵/数组.

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
Run Code Online (Sandbox Code Playgroud)

为了检查错误原因,尝试此操作会发生什么?

o <- llply(df.list, function(x) {
    table(x$data_value)
})
Run Code Online (Sandbox Code Playgroud)

编辑:为了使错误更容易理解,让我们创建这个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)
Run Code Online (Sandbox Code Playgroud)

现在运行laply:

laply(dl, function(x) table(x$a))
# Error: Results must have the same dimensions.
Run Code Online (Sandbox Code Playgroud)

为什么?要看到它,让我们打印出来:

> 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.
Run Code Online (Sandbox Code Playgroud)

你看到了问题?每行中的元素数量不同.你不能有一个矩阵(除非你附加较小元素的那些矩阵等于行).

相反,使用列表使它们成为列表的元素,以后可以使用[[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 
Run Code Online (Sandbox Code Playgroud)

希望这可以解决问题.

  • 我完全理解。愚蠢的错误,因为我会发现我是否在示例数据集中使用了具有不同行长度的 data.frames。我遗漏了导致问题的关键功能。谢谢您的解释! (2认同)