r - 将复制的数据移动到 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
我知道我需要提供我的解决方案,但我无法找到解决方案。
解决方案
这是一个选项,通过循环遍历names
除第一个数据集以外的数据集,按“M”分组,summarise
在 a 中list
,使用unnest_wider
,reduce
通过加入 的元素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>
推荐阅读
- sqlite - 相交保留两个查询的计数以进行排序
- javascript - 带有自定义项目符号的自动图像滑块
- javascript - 模拟内部 axios.create()
- rrdtool - 更新现有 RRD 文件中的值
- algorithm - 合并已排序的 n 个列表
- sql - 在 SQL Server 中将 '2018-07-02 00:01:22.000' 转换为 '02-Jul-18'
- linux - 我如何在 CentOS7 中静态分配 ip
- python - 在我将参数作为python pandas中的dict传递后,read_sql查询返回一个空数据帧
- html - Django REST 可浏览 API 模板更改
- sql - 更改某些列的默认权限