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)语句?如果它是realNA
而不是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'),但没有成功。我在转换中的错误在哪里?