r - 获取行名到列名,并将数据从行到同名的列放在一起
问题描述
我有一个这样的数据框:
X ID X1 X2 X3 X4 X5
BIL 1 1 2 7 1 5
Date 1 12.2 13.5 1.1 26.9 7.9
Year 1 2012 2013 2020 1999 2017
BIL 2 7 9 2 1 5
Date 2 12.2 13.5 1.1 26.9 7.9
Year 2 2022 2063 2000 1989 2015
BIL 3 1 2 7 1 5
Date 3 12.2 13.5 1.1 26.9 7.9
Year 3 2012 2013 2020 1999 2017
我想对其进行转换,以便获得一个新的 df,其中 BIL 日期年份作为列名,并在下面的行中列出值,例如
ID BIL Date Year
1 1 1 12.2 2012
2 1 2 13.5 2013
3 1 7
4 1 1
5 1 5
6 2 7 12.2 2022
7 2 9 13.5 2063
任何帮助将不胜感激!
编辑:有没有办法像我上面添加的那样添加分组变量
解决方案
这个策略会奏效。
- 通过将第一列名称与 X 等同来创建 ID 列。
- 转换为长格式,使用
names_to = NULL
参数取消选择不需要的列(您的原始变量名称) - 转换回宽,这次使用正确的变量名
- 使用参数将多个实例收集到
list
列中values_fn = list
pivot_wider
- 除了
ID
df <- read.table(text = 'X X1 X2 X3 X4 X5
BIL 1 2 7 1 5
Date 12.2 13.5 1.1 26.9 7.9
Year 2012 2013 2020 1999 2017
BIL 7 9 2 1 5
Date 12.2 13.5 1.1 26.9 7.9
Year 2022 2063 2000 1989 2015
BIL 1 2 7 1 5
Date 12.2 13.5 1.1 26.9 7.9
Year 2012 2013 2020 1999 2017', header = T)
library(tidyverse)
df %>% mutate(ID = cumsum(X == df[1,1])) %>%
pivot_longer(!c(X,ID), names_to = NULL) %>%
pivot_wider(id_cols = c(ID), names_from = X, values_from = value, values_fn = list) %>%
unnest(!ID)
#> # A tibble: 15 x 4
#> ID BIL Date Year
#> <int> <dbl> <dbl> <dbl>
#> 1 1 1 12.2 2012
#> 2 1 2 13.5 2013
#> 3 1 7 1.1 2020
#> 4 1 1 26.9 1999
#> 5 1 5 7.9 2017
#> 6 2 7 12.2 2022
#> 7 2 9 13.5 2063
#> 8 2 2 1.1 2000
#> 9 2 1 26.9 1989
#> 10 2 5 7.9 2015
#> 11 3 1 12.2 2012
#> 12 3 2 13.5 2013
#> 13 3 7 1.1 2020
#> 14 3 1 26.9 1999
#> 15 3 5 7.9 2017
由reprex 包于 2021-05-17 创建 (v2.0.0 )
这也会给你同样的结果
df %>% mutate(ID = cumsum(X == df[1,1])) %>%
pivot_longer(!c(X,ID)) %>%
pivot_wider(id_cols = c(ID, name), names_from = X, values_from = value) %>%
select(-name)
推荐阅读
- javascript - 在 Reducer 中保存设置并从另一个 Reducer 访问它们?
- javascript - 如何在 html 中使用 Node.js 来使用 mysql 数据?
- jenkins - 在 Jenkins 管道中处理秘密
- java - 如何使用 springboot 2.3.0 实现 liveness/readines
- go - golang bigtable cli 中的 AppendValue 未按预期工作
- html - 我创建了一个固定的导航栏,但现在按钮位于导航栏的顶部
- mysql - MYSQL:超过锁定等待超时;尝试重启事务
- sql-server - 将加减 Unicode 字符插入 SQL Server DB (TSQL)
- sql - 比较两个 xml sql 查询 DB2
- python - 给出一个字符串作为输入并打印下一个字母。输入:xyzabc 输出:yzabcd