【问题标题】:Matching and Adding Factor Counts in R Data Frames在 R 数据框中匹配和添加因子计数
【发布时间】:2013-03-20 22:08:09
【问题描述】:

我的问题源于thisthis 之前提出的问题,并且我认为与他们完全不同。想象一下,我有一个最小的数据集(鸟类),其中每一行代表在给定时间和地点对鸟类的观察,如下所示:

id,obs,country
A,4,USA
B,3,CAN
A,5,USA
C,4,MEX
C,1,USA
A,3,CAN
D,1,null

理想情况下,我想要的是将此数据集转换为这样的形式,从数据集中删除空值:

id,tot_obs,country_tot
A,12,2
B,3,1
C,5,2

我知道我可以使用以下方法计算因子数:

table(bird$country)

但是,有没有一种更聪明的方法,也许是一种去除空值、将总计数相加、找到国家的计数然后将它们重新配置为这种形式的方法?如果有一个包可以做到这一点,那么我也愿意接受这个建议。谢谢!

【问题讨论】:

  • 第一行的tot_obs不应该是12吗?
  • 道歉。这是一个错字。我现在已经编辑了。
  • Shion,是的,在那种情况下,下面的答案应该可以做到。

标签: r dataframe multiple-columns


【解决方案1】:

使用stringsAsFactors=FALSE加载数据:

df <- read.csv(header=TRUE, text="id,obs,country
A,4,USA
B,3,CAN
A,5,USA
C,4,MEX
C,1,USA
A,3,CAN
D,1,null", stringsAsFactors=FALSE)

# check to see if columns are factors
sapply(df, class)
#          id         obs     country 
# "character"   "integer" "character" 

删除所有带有country = null的行

df <- df[df$country != "null", ]

然后您可以使用plyr 包和summarise 来获得所需的结果,如下所示:

ddply(df, .(id), summarise, tot_obs=sum(obs), tot_country=length(unique(country)))
#   id tot_obs tot_country
# 1  A      12           2
# 2  B       3           1
# 3  C       5           2

【讨论】:

  • 我尝试了上面的确切代码。它给了我一个错误:Error in Summary.factor(c(45L, 3L, 165L, 3L, 165L, 3L, 70L, 165L, 165L, : sum not meaningful for factors
  • 是的。确保您的列不是因素。如果需要,使用stringsAsFactors=FALSE 加载您的 csv 文件。
  • 完美!非常感谢你的帮助。现在一切正常。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
相关资源
最近更新 更多