【问题标题】:R - Using cast from reshape package to transform list of dataframesR - 使用 reshape 包中的强制转换来转换数据帧列表
【发布时间】:2019-06-14 17:28:28
【问题描述】:

我已经创建了这个测试框架。

library(lubridate)
set.seed(23) 

date_list = seq(ymd('2000-01-01'),ymd('2003-12-31'),by='day')
testframe = data.frame(Date = date_list)
testframe$Day = substr(testframe$Date, start = 6, stop = 10)
testframe$ABC = rnorm(1461)
testframe$Year = as.numeric(format(testframe$Date,'%Y'))
testframe$Date = NULL
testframe = testframe[,c(ncol(testframe),1:(ncol(testframe)-1))]

我的问题是如何在数据框列表中执行此命令。这适用于单个数据框:

library(reshape)
testframe_t = cast(testframe, Year ~ Day)

但是当我创建一个数据框列表时,它不起作用。我的错在哪里?

df_list = list(testframe, testframe, testframe)

lapply(df_list, function(x) {
  cast(df_list$x$Year ~ df_list$x$Day)})

有什么想法吗?

【问题讨论】:

  • cast(x, Year ~ Day) 在函数体中应该可以工作
  • 谢谢!抱歉,这太简单了……差点就搞定了。
  • 我一直无法理解reshape::cast。但是tidyr::gathertidyr:spread 为我点击。 tidyr.tidyverse.org仅供参考

标签: r list dataframe reshape lapply


【解决方案1】:

这里是 dplyr/tidyr/purrr 方法。

library(tidyverse)
testframe1 = data.frame(Date = seq(ymd('2000-01-01'),ymd('2003-12-31'),by='day')) %>% 
  mutate(Day = substr(Date, start = 6, stop = 10),
         ABC = rnorm(1461),
         Year = as.numeric(format(Date,'%Y')),
         Date = NULL) %>% 
  select(Year, Day, ABC)

testframe2 = data.frame(Date = seq(ymd('2004-01-01'),ymd('2007-12-31'),by='day')) %>% 
  mutate(Day = substr(Date, start = 6, stop = 10),
         ABC = rnorm(1461),
         Year = as.numeric(format(Date,'%Y')),
         Date = NULL) %>% 
  select(Year, Day, ABC)


df_list = list(testframe1, testframe2)

df = map_dfr(df_list, ~.x %>% spread(Day, ABC)) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    相关资源
    最近更新 更多