Ошибка "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
Надеюсь, это прояснит ситуацию.