Почему я получаю ошибку функции в внешне похожем коде R? - PullRequest
2 голосов
/ 16 февраля 2012

Во-первых, это очень простой вопрос, который я не знаю, как сформулировать. Если вопрос является дубликатом (хотя я проверил, используя то, что, как мне показалось, может быть уместно сформулировать), я, очевидно, откажусь и оценим ссылку.

Во-вторых, я уверен, , есть более простой способ сделать то, что я пытаюсь, но я не хочу сбиваться с пути.

OK. Я пытаюсь просто получить таблицу пропорций столбцов из матрицы 0/1 (пропорция 1 зависит от значения другой переменной, которая в данном случае является PARTY).

мой data.frame - m103, с размерами (437,91) и следующим процессом (например, производит то, что я хочу):

prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))

Но, конечно, я хочу сохранить вывод, и именно здесь возникает ошибка. Если я сделаю это:

a <- prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))

Все отлично. Но НЕМЕДЛЕННО после этого, если я попытаюсь:

m103.avg.prop <- prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))

Я получаю ошибку:

Error in FUN(X[[2L]], ...) : only defined on a data frame with all numeric variables

Я бы хотел сохранить в своем коде рациональную схему именования (которая будет продолжена во втором примере), но я не могу сказать, связано ли это с тем, что я пытался присвоить выводу, или что-то другое.

Большое спасибо!

РЕДАКТИРОВАТЬ: Давайте посмотрим, могу ли я быть более явным

#Data import
m103 <- read.csv("103_members_party.csv", header=T)
#See the first few rows/columns
m103[1:5,1:5]
#Produces this: 
     ID PARTY X930 X461 X137
1 15245   100    0    0    0
2 15000   100    0    0    0
3 29108   200    0    0    0
4 15001   100    0    0    0
5 29132   100    0    0    0
#Sum and get col percentages by PARTY (sums the 1's when PARTY==100, PARTY==200, etc)
#WITHOUT assigning to anything
prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))
#Produces: 
            PARTY          V1
[1,] 1.122515e-05 0.580000465
[2,] 2.245030e-05 0.416619418
[3,] 3.681849e-05 0.003309623
#With assignment to a
a <- prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))
a
#Produces
            PARTY          V1
[1,] 1.122515e-05 0.580000465
[2,] 2.245030e-05 0.416619418
[3,] 3.681849e-05 0.003309623
#Now, assignment to m103.avg.prop
m103.avg.prop <- prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))
#results in error: 
Error in FUN(X[[2L]], ...) : 
  only defined on a data frame with all numeric variables

1 Ответ

2 голосов
/ 16 февраля 2012

Ошибка, которую вы получаете, состоит в том, что вы пытаетесь сложить что-то, что не является числом.Без воспроизводимого кода я не могу точно сказать вам, что происходит.Но одна из причин, по которой мы просим воспроизвести приведенный пример, заключается в том, что в процессе его создания вы часто обнаруживаете проблему самостоятельно.

В этом случае, я предполагаю, что данные пришли откуда-то наподобие Excel, который известен тем, что делал с данными удивительные вещи.попробуйте посмотреть на str(m103), и один из столбцов будет символьным вектором, а не числовым.в противном случае мне придется просматривать ваши данные.

Однако не должно быть никакой разницы между вашим назначением a и вашим назначением m103.avg.prop.В качестве примечания, я люблю избегать цифр в именах переменных везде, где это возможно, просто чтобы не запутаться!

РЕДАКТИРОВАТЬ: Добавить исполняемый код:

> m103<-data.frame(ID=c(15245, 15000, 29108, 15001, 29132),PARTY=c(100, 100, 200, 100, 100),X930=c(0, 0, 1, 0, 0),X461=c(0, 0, 0, 1, 1),X137=c(1, 1, 1, 1, 1))
> m103
     ID PARTY X930 X461 X137
1 15245   100    0    0    1
2 15000   100    0    0    1
3 29108   200    1    0    1
4 15001   100    0    1    1
5 29132   100    0    1    1

> prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))
            PARTY        V1
[1,] 0.0009579095 0.7163630
[2,] 0.0019158189 0.2807633
> a <- prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))
> m103.avg.prop <- prop.table(as.matrix(ddply(m103, .(PARTY), sum, na.rm=T)))
> a
            PARTY        V1
[1,] 0.0009579095 0.7163630
[2,] 0.0019158189 0.2807633
> m103.avg.prop
            PARTY        V1
[1,] 0.0009579095 0.7163630
[2,] 0.0019158189 0.2807633
> 

Я все еще не могу воспроизвести вашу проблему,Как я уже говорил выше, вывод str(m103) и вывод str(a) будут информативными.Также sessionInfo().Если не считать этого, я буду придерживаться моих предыдущих догадок ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...