【问题标题】:How do I transpose similar record values into separate columns in R with (reshape2 or etc)?如何使用(reshape2 等)将相似的记录值转置到 R 中的单独列中?
【发布时间】:2020-06-16 12:02:43
【问题描述】:

所以我想转换以下内容:

days <- c("MONDAY", "SUNDAY", "MONDAY", "SUNDAY", "MONDAY", "SUNDAY")
dates <- c("2020-03-02", "2020-03-08", "2020-03-09", "2020-03-15", "2020-03-16", "2020-03-22")

df <- cbind(days, dates)


+--------+------------+
|  days  |   dates    |
+--------+------------+
| MONDAY | 2020.03.02 |
| SUNDAY | 2020.03.08 |
| MONDAY | 2020.03.09 |
| SUNDAY | 2020.03.15 |
| MONDAY | 2020.03.16 |
| SUNDAY | 2020.03.22 |
+--------+------------+

进入这个:

+------------+------------+
|   MONDAY   |   SUNDAY   |
+------------+------------+
| 2020.03.02 | 2020.03.08 |
| 2020.03.09 | 2020.03.15 |
| 2020.03.16 | 2020.03.22 |
+------------+------------+

你有什么提示我应该怎么做吗?提前谢谢!

【问题讨论】:

  • 鉴于 df 是一个数据框(而不是像您的示例中那样的矩阵),您可以这样做:df &lt;- data.frame(days, dates); unstack(df, dates ~ days)
  • 您可能发现 tidyr/reshape2 很难做到这一点的一个原因是,从整洁数据的角度来看,这种转换是荒谬的。在整洁的数据中,行代表相关数据。在您的输出表中,星期一和星期日看起来像两个不相关的列。如果您想采用一种整洁的方法,您需要一些方法来确定哪些日期是相关的并且应该在一行中。
  • unstack thingy 几乎可以工作,但确实需要它们在 DF 中配对。有什么诀窍吗?

标签: r tidyr reshape2


【解决方案1】:

在 Base-R 中

sapply(split(df,df$days), function(x) x$dates)

     MONDAY       SUNDAY      
[1,] "2020-03-02" "2020-03-08"
[2,] "2020-03-09" "2020-03-15"
[3,] "2020-03-16" "2020-03-22"

【讨论】:

    【解决方案2】:

    这是tidyr 中的一个解决方案,它考虑了 JohannesNE 的 尖锐的评论。

    您可以将此视为您在回复中提到的“技巧”(假设每个连续的 MondaySunday 是一对):

    df <- as.data.frame(df) # tidyr needs a df object
    df <- cbind(pair = rep(1:3, each = 2), df) # the 'trick'!
    
      pair   days      dates
    1    1 MONDAY 2020-03-02
    2    1 SUNDAY 2020-03-08
    3    2 MONDAY 2020-03-09
    4    2 SUNDAY 2020-03-15
    5    3 MONDAY 2020-03-16
    6    3 SUNDAY 2020-03-22
    

    现在tidyr 实现:

    library(tidyr)
    
    df %>% pivot_wider(names_from = days, values_from = dates)
    
    # A tibble: 3 x 3
       pair MONDAY     SUNDAY    
      <int> <chr>      <chr>     
    1     1 2020-03-02 2020-03-08
    2     2 2020-03-09 2020-03-15
    3     3 2020-03-16 2020-03-22
    

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 2012-02-20
      • 2013-12-26
      相关资源
      最近更新 更多