R 旋转数据帧并粘贴字符
我有两个数据帧df和df_类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 <- 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