Ошибка "dims [product 0] не соответствует длине объекта" в R при использовании daply для подсчета частоты

У меня есть список 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() и что он делает. Большое спасибо.

1 ответ

Решение

Вы можете сделать это лучше, заменив цикл 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

Чтобы проверить причину вашей ошибки, что происходит, когда вы пытаетесь это сделать?

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 

Надеюсь, это прояснит ситуацию.

Другие вопросы по тегам