r - 按键/值转置多列并将它们组合起来
问题描述
我有以下数据框:
date <- c(1,2,3,4,5,6,7)
value1 <-c(10,20,30,0,0,0,0)
key1 <- c(100,200,300,0,0,0,0)
value2 <- c(0,0,0,0,40,30,20)
key2 <- c(0,0,0,0,400,500,600)
df <- data.frame(date,value1,key1,value2,key2)
它看起来像这样:
date value1 key1 value2 key2
1 10 100 0 0
2 20 200 0 0
3 30 300 0 0
4 0 0 0 0
5 0 0 40 400
6 0 0 30 500
7 0 0 20 600
我想像这样转换它:
date 100 200 300 400 500 600
1 10 0 0 0 0 0
2 0 20 0 0 0 0
3 10 0 30 0 0 0
4 10 0 0 0 0 0
5 10 0 0 40 0 0
6 10 0 0 0 30 0
7 10 0 0 0 0 20
我可以像这样手动转置它们:
library(tidyr)
numbers_transpose <- df %>% spread(key = key1, value = value1)
numbers_transpose <- numbers_transpose %>% spread(key = key2, value = value2)
但我有 50 对,并希望将其自动化。如何以简单的方式做到这一点?
解决方案
我们可以将其转换为“长”格式,pivot_longer
然后将其重新整形
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = -date, names_to = c('.value', 'grp'),
names_sep= "(?<=[a-z])(?=[0-9])", values_drop_na = TRUE) %>%
filter(key != 0) %>%
pivot_wider(names_from = key, values_from = value,
values_fill = list(value = 0)) %>%
select(-grp)
# A tibble: 6 x 7
# date `100` `200` `300` `400` `500` `600`
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 10 0 0 0 0 0
#2 2 0 20 0 0 0 0
#3 3 0 0 30 0 0 0
#4 5 0 0 0 40 0 0
#5 6 0 0 0 0 30 0
#6 7 0 0 0 0 0 20
推荐阅读
- xml - 在 eXide 度假
- java - 如何从 JVM 获取 zGC 分配停顿时间?
- android - 具有多个堆栈和导航组件的 DrawerLayout
- chef-infra - 对食谱的本地编辑被厨师客户端执行覆盖
- java - 在 gradle 项目中使用 IntelliJ 运行 main 方法,但只有 System.out 输出
- scala - 对来自函数调用的值创建一个迭代器
- javascript - 具有以下条件的 Employee 对象的 ES6 符号
- c# - 从表单文本框和复选框获取用户输入(即帐号、复选框、选中的单选按钮)并从 db 获取文件
- tensorflow - 在一个 GPU 中并行运行两个作业
- python - 如何使用可选参数python3创建一个函数