【问题标题】:In aggregate: sum not meaningful for factors总体而言:总和对因子没有意义
【发布时间】:2013-10-29 20:53:13
【问题描述】:

我正在尝试一些应该很简单的东西,非常欢迎任何关于正在发生的事情的提示。

我有一个大型数据框,其中包含来自某些城市的国家/地区进口数据。对于某些国家/地区,我有 2 个条目。我想汇总每个城市的进口量,并为每个国家/地区设置一个独特的行。我正在使用aggregate 函数。例如(我包含了数据框的一小部分):

municipalities<-c("country",1100056, 1100106,1100205,1100304,1200104,1200252)
c1<-c("Afghanistan",2,34,23.4,5,0,0)    
c2<-c("Afghanistan",0,20,11.1,5.4,2,0)    
c3<-c("Albania",12,120,11.4,5.1,12,10)    
c4<-c("Albania",0,40,61.1,65.4,652,2)
df<-as.data.frame(rbind(municipalities,c1,c2,c3,c4))

基本上我在尝试

df<-df[-1,]    
aggregate(df[,2:7],list(df[,1]),sum)

但我收到一条消息:

Error in Summary.factor(c(4L, 1L), na.rm = FALSE) : 
  sum not meaningful for factors

我试图强制 df 为数字,将字符声明为字符等,但似乎没有任何帮助。

【问题讨论】:

  • 您是如何创建实际的 data.frame 的?您在示例中给出的方式是创建无法求和的factors。考虑从您的实际数据中提供样本。您也许可以将dput(head(df)) 的输出粘贴到问题中。

标签: r aggregate factors


【解决方案1】:

这是因为您创建数据框的方式。例如,c1 是字符,因为向量只能有一个类。当您将它们放入数据框中时,这些字符向量会被进一步强制分解。因此,您尝试在因子上运行 sum。您已经知道了这一点,但随后尝试将因子转换为数字,这可能会给您带来荒谬的结果。

简单的答案是按列而不是按行构建数据框,这样您就不会遇到太多强制问题。

鉴于您已有的数据,这将解决您的问题:

df[] <- lapply(df, function(x) type.convert(as.character(x)))
aggregate(. ~ V1, df, sum)

(感谢@AnandaMahto 提供的转换方式比我原来的方式更简洁。)

结果:

           V1 V2  V3   V4   V5  V6 V7
1 Afghanistan  2  54 34.5 10.4   2  0
2     Albania 12 160 72.5 70.5 664 12

【讨论】:

  • 尝试:df[] &lt;- lapply(df, function(x) type.convert(as.character(x)))(其中df 来自原始问题中的步骤“df &lt;- df[-1, ]”。比您建议的要干净一些。
  • 哦,对于aggregate 步骤,请尝试aggregate(. ~ V1, df2, sum)
  • @Thomas - 如果数据集很大并且lapply() 处理速度很慢怎么办?
  • @ChetanArvindPatil 有factors 你想要numeric 是上游应该解决的问题。这个答案显示了一个快速修复,但如果您有一个速度很慢的大型数据集,您应该在读取数据时修复它。
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多