【问题标题】:How can I reshape my data frame to be used with cor() in R? [duplicate]如何重塑我的数据框以在 R 中与 cor() 一起使用? [复制]
【发布时间】:2020-01-17 15:20:56
【问题描述】:

我对 R 和数据争论很陌生。 我想使用 cor() 函数计算相关矩阵,为此我必须重塑我的数据框。它由在线商店的 1500 篇不同文章 (StockCodes) 组成,每篇文章的销售历史为 365 天(Quantity per Date per StockCode)。

我需要以 Dates 成为新的行名,StockCodes 成为新的列名的形式对其进行重塑。

考虑这个简短的例子:

my_df <- data.frame(Stockcode = c("A","A", "B","B", "C", "C"), Quantity = c(1,5,3,2,1,4), Date = c("2010-12-01","2010-12-02","2010-12-01","2010-12-02","2010-12-01","2010-12-02") )

看起来像这样:

  Stockcode Quantity       Date
1         A        1 2010-12-01
2         A        5 2010-12-02
3         B        3 2010-12-01
4         B        2 2010-12-02
5         C        1 2010-12-01
6         C        4 2010-12-02

而且我希望它变成:

df_reshaped <- data.frame(A = c(1,5), B = c(3,2), C = c(1,4), row.names = c("2010-12-01","2010-12-02"))

看起来像这样:

           A B C
2010-12-01 1 3 1
2010-12-02 5 2 4

我通过 for 循环实现了这一点(并成功计算了我的相关矩阵),但循环需要“年龄”才能执行(大约 4 小时)。

有没有合适更快捷的方法?

我将非常感谢任何帮助!

【问题讨论】:

  • 试试reshape(my_df, idvar = "Date", timevar = "Stockcode", direction = "wide", new.row.names = unique(my_df$Date))[, -1] 或者unstack(my_df[, 1:2], Quantity ~ Stockcode)
  • 谢谢! “unstack”的工作原理非常快 - 它稍微改变了列名并删除了发票日期/将其替换为 id。但对于相关矩阵,这无关紧要。 :-)

标签: r dataframe reshape correlation


【解决方案1】:

这是使用来自tidyrpivot_wider 的一种方式:

my_df %>%
   pivot_wider(names_from = Stockcode, values_from = Quantity) %>% ## pivot columns in wide format
   column_to_rownames(var = "Date") ## convert Date column to row names

#           A B C
#2010-12-01 1 3 1
#2010-12-02 5 2 4

【讨论】:

  • pivot_widertidyr,而不是 dplyr
  • @camille 更新了答案。
  • 非常感谢!这确实可以满足我的需要(也在我更大的数据帧上)并且比循环快得多:-)
  • 太棒了。如果它解决了您的问题,请考虑接受我的回答..
  • 完成。再次感谢您的快速答复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多