【问题标题】:Manipulating data frames with Date format columns - R使用日期格式列操作数据框 - R
【发布时间】:2012-09-14 08:10:47
【问题描述】:

对于从如下所示的 SQL 查询填充的数据框:

Company        Month         Total_Count
ABC            2012-03         10
ABC            2009-01         1
DEF            2011-01         29
GHI            2001-09         10
GHI            2008-01         9
GHI            2010-09         100

我想出一份总结报告,输出如下:

Company          Total         Months
ABC              11            10         1
DEF              29            29
GHI              119           10      9    100

Total 列将是所有月份的总和
和列Months 将是该组织遇到的每个月的个人计数。我很想看看是否有可能以某种方式挤进实际的月份。比如:

Company          Total         Months
                               2009-01    2012-03
ABC              11            10      1
                               2011-01
DEF              29            29
                               2001-09   2008-01   2010-09
GHI              119           10        9         100

到目前为止,我只能通过以下方式获得上述所需结果的前 2 列:

df1 <- ddply(resultSet, .(company_name), summarize, sum(as.numeric(total_count)))

但我不确定如何附加个别月份的信息

【问题讨论】:

  • 这些可能不是 R 中的日期或日期时间列。您可能正在聚合“因子”或“字符”分类变量。

标签: r plyr


【解决方案1】:
library(reshape2)
res <- ddply(resultSet, .(Company), summarize, Total = sum(Total_Count))
# if value.var is not specified, dcast uses the last column. see ?guess_value
months <- dcast(resultSet, Company ~ Month, value.var = "Total_Count", sum)
join(res, months, by = "Company")
  Company Total 2001-09 2008-01 2009-01 2010-09 2011-01 2012-03
1     ABC    11      NA      NA       1      NA      NA      10
2     DEF    29      NA      NA      NA      NA      29      NA
3     GHI   119      10       9      NA     100      NA      NA

在问题的上下文中具有聚合功能很重要。

【讨论】:

  • 我不明白dcast 函数是如何使用Total_Count 列生成该表的。如果明天我有另一个表示其他内容的 Count 列怎么办。是否可以指定可以使用哪一列来展开表格?
  • 它自动猜到了Total_Count,因为那是最后一列(在这种情况下,也是唯一的)。您可以使用value.var 明确指定它。默认情况下,它猜测最后一列是值列。请参阅?guess_value 了解更多信息。
  • 所以,我在数据框中添加了另一个计数列。即使在新列中提到value.var 之后,dcast 在创建新表时似乎也指的是旧列。我不确定代码中是否存在错误,或者我是否做错了什么。你能帮帮我吗?
  • 我的结果计算错误的原因是因为我们没有聚合函数名称,即month &lt;- dcast(resultSet, Company ~ Month, value.var="Total_Count", sum)。这将是完整的解决方案。
【解决方案2】:

因为你没有给它起名字,所以我选择了“cdf”

agg1 <- aggregate(namcounts, cdf['Company'], function(x) sumC=sum(x) )
aggC <- lapply( split(namcounts, cdf['Company']), function(x)  listC= list(x) ) 
agg1$clist <- sapply(aggC, "[[" ,1)
agg1
  Company   x      clist
1     ABC  11      10, 1
2     DEF  29         29
3     GHI 119 10, 9, 100

另一种记录方式是使用分隔符粘贴月份计数。目前这些都存储为一个列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多