首页 > 解决方案 > 将复制的数据移动到 R 中的下一列

问题描述

我的数据如下:

df <- read.table(text = "M	X	Z
 'bam'	12	'B1'
 'sdr'	11	'B3'
                  'kar'	13	'B5'
                 'mmn'	13	'B7'
                   'bam'	14	'B4'
                   'kar'	17	'B1'
                   'bam'	10	'B6'
                   'zar'	11	'B8'
                   'mmn'	12	'B12'
                   
                  ", header = TRUE)

我想将复制的数据移动到下一列。考虑到“bam”,它出现了三遍。现在,我想将它移到下一列,它第一次出现的地方,其他复制的数据将出现在其他列中。当复制的数据被移动到其他列时,它们将从列中删除,得到以下表:

df <- read.table(text = " M	X	Z	X1	Z1	X2	Z2
 'bam'	12	'B1'	14	'B4'	10	'B6'
                   'sdr'	11	'B3'	NA	NA	NA	NA
                   'kar'	13	'B5'	17	'B1'	NA	NA
                   'mmn'	13	'B7'	12	'B12'	NA	NA
                   NA	NA	NA	NA	NA	NA	NA
                   NA	NA	NA	NA	NA	NA	NA
                  NA	NA	NA	NA	NA	NA	NA
                  'zar'	11	'B8'	NA	NA	NA	NA
                   NA	NA	NA	NA	NA	NA	NA
                   
                 
                 ", header = TRUE)
> df

我知道我需要提供我的解决方案,但我无法找到解决方案。

标签: rtidyverse

解决方案


这是一个选项,通过循环遍历names除第一个数据集以外的数据集,按“M”分组,summarise在 a 中list,使用unnest_widerreduce通过加入 的元素list,然后right_join使用原始数据集“M”并重新排序数据集的列

library(purrr)
library(tidyr)
library(dplyr)
library(stringr)
map(names(df)[-1], ~ df %>%
       dplyr::select(M, .x) %>% 
       group_by(M) %>%
       summarise(!! .x := list(as.list(!! rlang::sym(.x)) %>% 
                     set_names(str_c(.x, seq_along(.)))))  %>% 
       unnest_wider(.x)) %>% 
  reduce(full_join, by = 'M') %>% 
  right_join(df1 %>%
                dplyr::select(M)) %>% 
  dplyr::select(M, order(str_remove(names(.)[-1], "\\D+")) + 1)
# A tibble: 9 x 7
#  M        X1 Z1       X2 Z2       X3 Z3   
#  <fct> <int> <fct> <int> <fct> <int> <fct>
#1 bam      12 B1       14 B4       10 B6   
#2 sdr      11 B3       NA <NA>     NA <NA> 
#3 kar      13 B5       17 B1       NA <NA> 
#4 mmn      13 B7       12 B12      NA <NA> 
#5 <NA>     NA <NA>     NA <NA>     NA <NA> 
#6 <NA>     NA <NA>     NA <NA>     NA <NA> 
#7 <NA>     NA <NA>     NA <NA>     NA <NA> 
#8 zar      11 B8       NA <NA>     NA <NA> 
#9 <NA>     NA <NA>     NA <NA>     NA <NA> 

推荐阅读