R pivot_是多个不同类型的变量

R pivot_是多个不同类型的变量,r,tidyr,R,Tidyr,我正试图找到一种简单的方法来透视一个数据帧,该数据帧有多个列,每个列包含不同的数据。在names\u to中使用多个名称似乎无法解决问题 以下是一个成功的例子: #create the dataframe: library('dplyr') set.seed(11) x <- data.frame(case = c(1:10), X1990 = runif(10, 0, 1), flag.1990 = rep(c('a','b

我正试图找到一种简单的方法来透视一个数据帧,该数据帧有多个列,每个列包含不同的数据。在
names\u to
中使用多个名称似乎无法解决问题

以下是一个成功的例子:

#create the dataframe:
library('dplyr')
set.seed(11)
x <- data.frame(case = c(1:10),
                X1990 = runif(10, 0, 1),
                flag.1990 = rep(c('a','b'), 5),
                X2000 = runif(10, 0, 1),
                flag.2000 = rep(c('c', 'd'), 5))

> x
   case        X1990 flag.1990     X2000 flag.2000
1     1 0.2772497942         a 0.1751129         c
2     2 0.0005183129         b 0.4407503         d
3     3 0.5106083730         a 0.9071830         c
4     4 0.0140479084         b 0.8510419         d
5     5 0.0646897766         a 0.7339875         c
6     6 0.9548492255         b 0.5736857         d
7     7 0.0864958912         a 0.4817655         c
8     8 0.2899750092         b 0.3306110         d
9     9 0.8806991728         a 0.1576602         c
10   10 0.1232162013         b 0.4801341         d
事情不可行,因为标志数据不在变量名中

我认为解决这个问题的唯一方法是将数据帧分解为两个数据帧,对它们进行透视,然后将它们连接起来。例如:

#create temporary data frame for year data, then pivot
temp1 <- x %>%
  select(1,2, 4) %>% #select year data
  pivot_longer(cols = c(X1990, X2000), #pivot longer on year data
               names_to = 'year', 
               values_to = 'value') %>%
  mutate(year = gsub('X', '', year)) #remove 'X' so that I can use this to join

#create temporary data frame for flag data, then pivot
temp2 <- x %>%
  select(1, 3, 5) %>% #select flag variables
  pivot_longer(cols = c(flag.1990, flag.2000), #pivot longer on flag data
               names_to = 'flag.year', 
               values_to = 'flag') %>%
  mutate(year = gsub('flag.', '', flag.year)) %>% #get year data so that I can join on this
  select(-flag.year) #drop flag.year as its no longer useful information
 
final <- full_join(temp1, temp2, by = c('case', 'year')) #full join the two datasets to get the final data

> final
# A tibble: 20 x 4
    case flag  year     value
   <int> <chr> <chr>    <dbl>
 1     1 a     1990  0.277   
 2     1 c     2000  0.175   
 3     2 b     1990  0.000518
 4     2 d     2000  0.441   
 5     3 a     1990  0.511   
 6     3 c     2000  0.907   
 7     4 b     1990  0.0140  
 8     4 d     2000  0.851   
 9     5 a     1990  0.0647  
10     5 c     2000  0.734   
11     6 b     1990  0.955   
12     6 d     2000  0.574   
13     7 a     1990  0.0865  
14     7 c     2000  0.482   
15     8 b     1990  0.290   
16     8 d     2000  0.331   
17     9 a     1990  0.881   
18     9 c     2000  0.158   
19    10 b     1990  0.123   
20    10 d     2000  0.480
#为年份数据创建临时数据框,然后透视
临时工1%
选择(1,2,4)%>%#选择年份数据
数据透视时间更长(cols=c(X1990,X2000),#数据透视时间更长
名称_to='年',
值_to='value')%>%
mutate(year=gsub('X','',year))#删除'X',以便我可以使用它加入
#为标志数据创建临时数据框,然后透视
临时雇员2%
选择(1、3、5)%>%#选择标志变量
pivot_longer(cols=c(flag.1990,flag.2000),#在标志数据上pivot longer
name_to='flag.year',
值_to='flag')%>%
mutate(year=gsub('flag.','',flag.year))%>%#获取年份数据,以便我可以加入此项目
选择(-flag.year)#删除flag.year作为不再有用的信息
决赛
#一个tibble:20x4
案例标志年值
1 a 1990 0.277
2 1 c 2000 0.175
3 2 b 1990 0.000518
42D2000 0.441
5 3 a 1990 0.511
6 3 c 2000 0.907
7 4 b 1990 0.0140
8.4 d 2000 0.851
95A 1990 0.0647
10 5 c 2000 0.734
116b 1990 0.955
12 6 d 2000 0.574
137A 1990 0.0865
14 7 c 2000 0.482
15 8 b 1990 0.290
16 8 d 2000 0.331
17 9 a 1990 0.881
18 9 c 2000 0.158
19 10 b 1990 0.123
20 10 d 2000 0.480

我想有一种更快的方法。我是否只是误读了有关在
名称\u至
中使用多个名称的文档。有什么想法吗?

在这种情况下,必须使用
名称
名称
模式相结合:

库(dplyr)
图书馆(tidyr)
>x%>%
pivot_更长(cols=-情况,
名称_to=c(“.value”,“year”),
名称\u模式=“([^\\.]*)\\.*(\\d{4})”)
#一个tibble:20x4
案例X年旗帜
1 1990 0.277 a
212000 0.175摄氏度
3.2 1990 0.000518 b
4220000.441d
53 1990 0.511 a
6.3 2000 0.907摄氏度
7 4 1990 0.0140 b
8 4 2000 0.851 d
951990 0.0647 a
10520000.734摄氏度
11 6 1990 0.955 b
12 6 2000 0.574 d
13 7 1990 0.0865 a
14 7 2000 0.482摄氏度
15 8 1990 0.290 b
16 8 2000 0.331 d
17 9 1990 0.881 a
18 9 2000 0.158摄氏度
19 10 1990 0.123 b
20 10 2000 0.480 d

在这种情况下,必须使用
名称到
名称模式结合使用

库(dplyr)
图书馆(tidyr)
>x%>%
pivot_更长(cols=-情况,
名称_to=c(“.value”,“year”),
名称\u模式=“([^\\.]*)\\.*(\\d{4})”)
#一个tibble:20x4
案例X年旗帜
1 1990 0.277 a
212000 0.175摄氏度
3.2 1990 0.000518 b
4220000.441d
53 1990 0.511 a
6.3 2000 0.907摄氏度
7 4 1990 0.0140 b
8 4 2000 0.851 d
951990 0.0647 a
10520000.734摄氏度
11 6 1990 0.955 b
12 6 2000 0.574 d
13 7 1990 0.0865 a
14 7 2000 0.482摄氏度
15 8 1990 0.290 b
16 8 2000 0.331 d
17 9 1990 0.881 a
18 9 2000 0.158摄氏度
19 10 1990 0.123 b
20 10 2000 0.480 d
#create temporary data frame for year data, then pivot
temp1 <- x %>%
  select(1,2, 4) %>% #select year data
  pivot_longer(cols = c(X1990, X2000), #pivot longer on year data
               names_to = 'year', 
               values_to = 'value') %>%
  mutate(year = gsub('X', '', year)) #remove 'X' so that I can use this to join

#create temporary data frame for flag data, then pivot
temp2 <- x %>%
  select(1, 3, 5) %>% #select flag variables
  pivot_longer(cols = c(flag.1990, flag.2000), #pivot longer on flag data
               names_to = 'flag.year', 
               values_to = 'flag') %>%
  mutate(year = gsub('flag.', '', flag.year)) %>% #get year data so that I can join on this
  select(-flag.year) #drop flag.year as its no longer useful information
 
final <- full_join(temp1, temp2, by = c('case', 'year')) #full join the two datasets to get the final data

> final
# A tibble: 20 x 4
    case flag  year     value
   <int> <chr> <chr>    <dbl>
 1     1 a     1990  0.277   
 2     1 c     2000  0.175   
 3     2 b     1990  0.000518
 4     2 d     2000  0.441   
 5     3 a     1990  0.511   
 6     3 c     2000  0.907   
 7     4 b     1990  0.0140  
 8     4 d     2000  0.851   
 9     5 a     1990  0.0647  
10     5 c     2000  0.734   
11     6 b     1990  0.955   
12     6 d     2000  0.574   
13     7 a     1990  0.0865  
14     7 c     2000  0.482   
15     8 b     1990  0.290   
16     8 d     2000  0.331   
17     9 a     1990  0.881   
18     9 c     2000  0.158   
19    10 b     1990  0.123   
20    10 d     2000  0.480