R 按键/值转换多个列并将其组合

R 按键/值转换多个列并将其组合,r,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 va

我有以下数据帧:

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)
我可以像这样手动转换它们:

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)
library(tidyr)
数字\u转置%排列(键=键1,值=值1)
数字\u转置%排列(键=键2,值=值2)

但是我有50双,我想把它自动化。如何以简单的方式完成此操作?

我们可以使用
pivot\u long
将其转换为“long”格式,然后将其重新整形

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
库(dplyr)
图书馆(tidyr)
df%>%
pivot_longer(cols=-date,names_to=c('.value',grp'),

names_sep=“(?哦,这是一个错误。对不起。我编辑了它。对于第二列,为什么值10会重复,因为初始值只有date1和10Ok。您的代码在玩具示例中似乎运行良好。在真实数据集中,我有N/a值而不是零,它不能正常工作。我是否应该修改过滤器(键!=0)语句?如果它是real
NA
而不是
N/A
,则更容易,也就是说,在
pivot\u更长的
中使用
values\u drop\u NA=TRUE
并删除
filter
步骤。如果它是字符“N/A”,则转换为
NA
或使用
filter(key!=“N/A”)
非常感谢。我对列名有点问题。在实际数据中,它们类似于X100和D_100;。我尝试使用名称_to=c('.X',grp')和名称_from=c('.D_100;,'grp'),但没有成功。我在转换中的错误在哪里?