R 旋转数据帧并粘贴字符

R 旋转数据帧并粘贴字符,r,dplyr,tidyr,R,Dplyr,Tidyr,我有两个数据帧df和df_类 df <- structure(list(a = c(1,2,2,0), b = c(2,1,2,2)),row.names=c(NA,-4L) ,class = "data.frame") 我使用以下内容将df更改为宽格式(归功于Ronak Shah): 我尝试将df和df_类结合起来,然后将pivot_放得更宽(cols=c(“a”,“b”)),但无法正确获得1_类型、2_类型的列。实际上,我有4列,正在将它

我有两个数据帧df和df_类

df <- structure(list(a = c(1,2,2,0),
                       b = c(2,1,2,2)),row.names=c(NA,-4L) ,class = "data.frame")
我使用以下内容将df更改为宽格式(归功于Ronak Shah):


我尝试将df和df_类结合起来,然后将pivot_放得更宽(cols=c(“a”,“b”)),但无法正确获得1_类型、2_类型的列。实际上,我有4列,正在将它们转换为2列。

在这种情况下,我们可以通过连接将“df_类”旋转为“long”格式后,从“df_类”创建一列,然后使用“df_类”中的列,而不是“value”列

library(dplyr)
library(tidyr)
library(stringr)
df %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row) %>%
  left_join( df_class %>% 
                mutate(row = row_number()) %>%
                pivot_longer(cols = -row) %>%
                mutate(name = str_remove(name, 'type')),
     by = c('row', 'name')) %>% 
  filter(value.x != 0) %>%
  group_by(row, value.x = str_c(value.x, "_type")) %>%
  summarise(val = str_c(value.y, collapse="/")) %>% 
  ungroup %>%
  pivot_wider(names_from = value.x, values_from = val) %>%
  select(-row)
# A tibble: 4 x 2
#  `1_type` `2_type`
#  <chr>    <chr>   
#1 A1       B1      
#2 B2       A2      
#3 <NA>     A3/B3   
#4 <NA>     B4     
df_class <- structure(list(atype = c("A1","A2","A3","A4"),
                                 btype = c("B1","B2","B3","B4")),row.names=c(NA,-4L) ,class = "data.frame")
  atype btype
1    A1    B1
2    A2    B2
3    A3    B3
4    A4    B4
library(dplyr)
library(tidyr)

df %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row) %>%
  filter(value != 0) %>%
  group_by(row, value) %>%
  summarise(val = paste(name, collapse = "/")) %>%
  pivot_wider(names_from = value, values_from = val)
  row    1   2
1   1    a   b
2   2    b   a
3   3 <NA> a/b
4   4 <NA>   b
  1_type 2_type
1    A1    B1
2    B2    A2
3    NA    A3/B3
4    NA    B4
library(dplyr)
library(tidyr)
library(stringr)
df %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row) %>%
  left_join( df_class %>% 
                mutate(row = row_number()) %>%
                pivot_longer(cols = -row) %>%
                mutate(name = str_remove(name, 'type')),
     by = c('row', 'name')) %>% 
  filter(value.x != 0) %>%
  group_by(row, value.x = str_c(value.x, "_type")) %>%
  summarise(val = str_c(value.y, collapse="/")) %>% 
  ungroup %>%
  pivot_wider(names_from = value.x, values_from = val) %>%
  select(-row)
# A tibble: 4 x 2
#  `1_type` `2_type`
#  <chr>    <chr>   
#1 A1       B1      
#2 B2       A2      
#3 <NA>     A3/B3   
#4 <NA>     B4     
df %>%
   rename_all(~ str_c(., '_number')) %>%
   bind_cols(df_class %>%
                rename_all(~ str_replace(., 'type', '_type'))) %>% 
   mutate(rn = row_number()) %>%
   pivot_longer(cols = -rn, names_sep = "_", names_to = c("group", ".value")) %>%
   filter(number != 0) %>% 
   group_by(rn, number = str_c(number, "_type")) %>%
   summarise(type = str_c(type, collapse="/")) %>% 
   ungroup %>% 
   pivot_wider(names_from = number, values_from = type) %>% 
   select(-rn)
# A tibble: 4 x 2
#  `1_type` `2_type`
#  <chr>    <chr>   
#1 A1       B1      
#2 B2       A2      
#3 <NA>     A3/B3   
#4 <NA>     B4