【问题标题】:reshape r dataframe to wide format将 r 数据框重塑为宽格式
【发布时间】:2013-08-16 16:32:28
【问题描述】:

有没有简单的方法来重塑这个

id  date
A   Jan 2012
B   Jan 2012
C   Jan 2012
A   Feb 2012
B   Feb 2012
A   Mar 2012
B   MAr 2012

id  Jan 2012    Feb 2012    Mar 2012
A   T           T           T
B   T           T           T
C   T           F           F

dcastreshape 需要一个我认为不需要的聚合函数 (?)

【问题讨论】:

  • 嗯。 table(mydf) 你的对象在哪里被称为“mydf”?
  • @AnandaMahto +1 我在其中添加了 - 但你的意思是 table(mydf) > 0
  • @SimonO101, TRUE 计算结果为“1”,FALSE 计算结果为“0”,所以我认为这不是完全必要的。
  • @AnandaMahto 是的,在这种情况下非常正确。如果任何组合有多个条目,您将需要它 - 我之所以这么说是因为我使用了数据。

标签: r reshape


【解决方案1】:

按照您的建议使用dcast...

#  Please provide reproducible data next time!
set.seed(123)
dt <- data.frame( id = rep(c("A","B","C"),3 ), date = sample( month.name[1:3] , 9 , repl = TRUE ) , stringsAsFactors = FALSE )
#  id     date
#1  A  January
#2  B    March
#3  C February
#4  A    March
#5  B    March
#6  C  January
#7  A February
#8  B    March
#9  C February

require( reshape2 )
dcast( dt , id ~ date  , fun = function(x) length(x) > 0 , fill = FALSE )
#  id February January March
#1  A     TRUE    TRUE  TRUE
#2  B    FALSE   FALSE  TRUE
#3  C     TRUE    TRUE FALSE

或者只是 table 作为 @AnandaMahto 建议...

table(dt) > 0
#   date
#id  February January March
#  A     TRUE    TRUE  TRUE
#  B    FALSE   FALSE  TRUE
#  C     TRUE    TRUE FALSE

这在语法上当然更容易!

【讨论】:

  • dcastusing date as value column: use values.var to override 然后粉碎!这是连续第三次......
  • @nigmastar 你的数据有多大,有多少组合?
  • 是一个data.table,有大约 650 万行和 40 万个唯一 ID。但它是我拥有的最小的一个。我可能已经习惯了data.table,以至于现在任何其他包都看起来很糟糕:-)
  • 我认为我们需要一个data.table 解决方案。
  • 可能,或者我需要将“堆栈”中的下一个函数(需要宽格式)更改为另一个可以直接使用长格式的函数。
【解决方案2】:

我认为这对您正在寻找的东西非常有用:

library(zoo)
df <- data.frame(id = c("A", "B", "C", "A", "B", "A", "B"), date = c("2012-01", "2012-01", "2012-01", "2012-02", "2012-02", "2012-03", "2012-03"))
df$date <- as.yearmon(df$date)

result <- with(df, tapply(date, list(id, date), length))
result[is.na(result)] <- 0
result <- (result == 1)

你得到:

   Jan 2012 Feb 2012 Mar 2012
 A     TRUE     TRUE     TRUE
 B     TRUE     TRUE     TRUE
 C     TRUE    FALSE    FALSE

【讨论】:

  • 没有reshape,没有dcast
  • 谢谢。我确实将 zoo 用于它的 yearmon 课程,但我必须摆脱它,因为它对于“大”数据来说非常缓慢。
  • @nigmastar 这里的zoo 库只是用来格式化我的测试数据框,使其看起来像你的。其他代码行不需要zoo
  • 我知道,因此我没有批评您的回答。我的意思是“哦酷!,我也使用动物园!但不幸的是......等等等等”
  • 呵呵,我明白了 :) 您是否要替换 as.yearmon 函数?此外,对于大数据,xts 将是比zoo 更好的选择。
猜你喜欢
  • 2022-07-28
  • 2021-08-27
  • 2017-07-20
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2021-05-01
相关资源
最近更新 更多