【问题标题】:split a dataframe, rearrange and save as separate csv files [duplicate]拆分数据框,重新排列并保存为单独的 csv 文件 [重复]
【发布时间】:2019-12-08 12:29:30
【问题描述】:

我知道这对 R 用户来说相当简单,但很难完成这个简单的任务:

我有这个数据框:

数据

set.seed(123)
df <- data.frame(ID_series=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18), 
             year=c(2010,2011,2012,2010,2011,2012,2010,2011,2012,2010,2011,2012,
                    2010,2011,2012,2010,2011,2012), 
             IDPlot=c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2), 
             value=runif(18, 0.0, 1.0))

我需要:

  1. 通过IDPlot分割数据帧
  2. 重新排列,使年份在行中,ID_series 在列中
  3. 在 csv 中保存由 IDPlot 命名的单独数据帧。

感谢您的建议! 迈克尔

【问题讨论】:

  • 请提供您的预期输出。你试过什么吗?使用data.table::dcasttidyr::spread 可能很简单。
  • ...输出应该是 IDPlots 的单独矩阵 [year,ID_series] 并存储在 IDPlots 命名的单独 csv 文件中......这对您来说足够信息吗?非常感谢您的努力...
  • 对不起,这还不够清楚。你的意思是这样的吗? structure(list(year = c(2010, 2011, 2012), `1` = c(1, 1, 1), `2` = c(1, 1, 1), `3` = c(1, 1, 1)), class = "data.frame", row.names = c(NA, -3L)) 还有,你试过什么
  • 这能回答你的问题吗? Split dataframe into multiple output files
  • @MDEWITT,我认为您忽略了问题的重塑部分(尽管拆分/写入可能是正确的)。

标签: r


【解决方案1】:

您可以将数据转换为宽格式,然后使用group_split 将其拆分为不同的数据帧。

library(tidyverse)

out <- df %>%
         pivot_wider(names_from = ID_series, values_from = value) %>%
         group_split(IDPlot) 

out
#[[1]]
# A tibble: 3 x 5
#   year IDPlot   `1`    `2`   `3`
#  <dbl>  <dbl> <dbl>  <dbl> <dbl>
#1  2010      1 0.288 0.883  0.528
#2  2011      1 0.788 0.940  0.892
#3  2012      1 0.409 0.0456 0.551

#[[2]]
# A tibble: 3 x 5
#   year IDPlot   `1`   `2`    `3`
#  <dbl>  <dbl> <dbl> <dbl>  <dbl>
#1  2010      2 0.457 0.678 0.900 
#2  2011      2 0.957 0.573 0.246 
#3  2012      2 0.453 0.103 0.0421

或其他方式先拆分,然后将每个数据帧转换为宽格式。

out <- df %>%
         group_split(IDPlot) %>%
         map(~pivot_wider(., names_from = ID_series, values_from = value))

如果你想将它们写在单独的 csv 中,你可以这样做

lapply(seq_along(out), function(x) 
      write.csv(out[[x]], paste0('df', x, '.csv', row.names = FALSE)))

数据

set.seed(123)
df <- data.frame(ID_series=c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3), 
             year=c(2010,2011,2012,2010,2011,2012,2010,2011,2012,2010,2011,2012,
                    2010,2011,2012,2010,2011,2012), 
             IDPlot=c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2), 
             value=runif(18, 0.0, 1.0))

【讨论】:

  • ....谢谢您的代码...这是一个不错的选择,但是,在我的原始数据集中(我没有提供它,因为它包括超过 21 行), ID_series 在 IDPlot 之间发生变化。所以我需要一个选项,首先“拆分”,然后将拆分的数据帧重新整形为具有矩阵 [year, ID_series],最后将这些重新整形的矩阵存储到新的单独数据帧中。再次感谢所有提供想法的人!
  • @naRuser 检查更新的答案。它首先拆分,然后将其转换为宽格式。这就是你想要的吗?
  • ...是的,这行得通,完美!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 2020-11-30
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多