为什么我在看似相似的R代码中出现函数错误?

时间:2012-02-16 15:33:15

标签: r

首先,这是一个非常基本的问题,我不确定如何用语。如果问题是重复的(尽管我使用我认为可能适当的措辞来检查),我显然会收回并欣赏链接。

其次,我确定有一种更简单的方式来做我想尝试的事情,但不想偏离轨道。

行。我试图从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 个答案:

答案 0 :(得分:2)

你得到的错误是因为你试图总结一些不是数字的东西。没有可重现的代码,我无法准确地告诉你发生了什么。但是,我们要求一个可重复的例子的原因之一是,在制作一个例子的过程中,你经常会发现自己的问题。

在这种情况下,我假设数据来自某个地方,比如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()。没错,我会坚持以前的猜测......