【问题标题】:dplyr dynamically generate column to mutatedplyr 动态生成要变异的列
【发布时间】:2017-09-04 00:16:43
【问题描述】:

我有一个数据框,其中有一列表示日期,另一列表示金额,以及包含年份的各种列。我想将金额列中的值放入与日期列中的年份对应的年份列中。例如,

ID    Date         Amount        2010    2011    2012
01    2010/05/05   200           200
02    2011/05/05   300                   300
03    2012/05/05   400                           400

有没有一种方法可以根据日期列的值动态选择要改变的列?

【问题讨论】:

  • 我很想知道为什么这种“不整洁”的格式是必要的?例如,与仅创建单个 Year 列相反,或者仅根据需要将日期转换为年份?
  • 原始数据是以这种方式处理的,因此我试图复制该格式以实现兼容性。最后,我决定反对它,但它变得相当混乱。

标签: r dplyr


【解决方案1】:

使用lubridateyear 将日期转换为年份后,您可以使用tidyr 包中的spread 将数据散布出去:

library(dplyr)
library(tidyr)
df = read.table(text = "ID    Date         Amount
            01    2010/05/05   200        
            02    2011/05/05   300     
            03    2012/05/05   400 ", header= TRUE)

df %>% 
    mutate(y = lubridate::year(Date)) %>% 
    spread(key = y, value = Amount)

缺失的数据点将是NA's。如果您喜欢示例中的空白字符串,请尝试:

... %>%
    spread(key = y, value = Amount, fill = "")

请注意,生成的数据框不再有 Amount 列,但您可以通过合并到原始数据来取回它。

【讨论】:

  • 您可以通过将drop参数设置为FALSE来保留金额列,无需重新合并:)
【解决方案2】:

为了完整起见,还有一个“单行”使用data.table

library(data.table)
dcast(DF, ID + Date + Amount ~ year(Date), fill = "")

请注意,year 列是即时计算的。所以在reshaping之前不需要创建helper y变量。

  ID       Date Amount 2010 2011 2012
1 01 2010-05-05    200  200          
2 02 2011-05-05    300       300     
3 03 2012-05-05    400            400

数据

DF <- structure(list(ID = c("01", "02", "03"), Date = structure(c(14734, 
15099, 15465), class = "Date"), Amount = c(200L, 300L, 400L)), .Names = c("ID", 
"Date", "Amount"), row.names = c(NA, -3L), class = "data.frame")

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多