r - 拆分数据框,重新排列并保存为单独的 csv 文件
问题描述
我知道这对 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))
我会需要:
- 通过 IDPlot 分割数据帧
- 重新排列它,使年份在行中,ID_series 在列中
- 在 csv 中保存由 IDPlot 命名的单独数据帧。
感谢您的建议!迈克尔
解决方案
您可以将数据转换为宽格式,然后将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))
如果你想把它们写在单独的 csvs 中,你可以这样做
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))
推荐阅读
- php - 从 Json API 端点获取数据并将数据保存在数组中。基本上从从 API 回调接收到的 Json 数据创建变量
- angular - 如何修复 net::ERR_ABORTED 404(未找到)
- javascript - Jquery 在 if 语句中找不到“this”
- python - df 对具有相同日期的行进行分组
- javafx - MediaView 不显示 mp4
- spring - 在 spring-cloud SNS/SQS 监听器中获取 MessageAttributes 的问题
- python-3.x - 在没有 input() python 3的情况下要求用户输入
- ruby-on-rails - 在 Active Storage Rails 5.2 中删除 has_many_attached 项
- dart - setState 不改变如何将 StatefulWidget 设置为 StatefulWidget?
- ntfs - 具有多个文件名属性和重解析点的 MFT 文件条目