我有30列,我想对它们进行排序。似乎需要多个软件包,但我努力做到这一点。下面是一个数据示例:
df<-read.table (text=" Id Name Class bc1 M1 G1
23 Smith A1 13 13 12
19 John Z1 12 14 12
33 Rose OG1 14 13 14
66 Javid MO1 12 14 13
66 Javid MO2 12 13 14
23 Smith A11 12 13 12
33 Rose OG2 14 14 13
19 John Z11 12 12 12
", header=TRUE)
我想要得到这些数据:
Id Name Class1 bc1 M1 G1 Class2 bc1 M1 G1
23 Smith A1 13 13 12 A11 12 13 12
19 John Z1 12 14 12 Z11 12 12 12
33 Rose OG1 14 13 14 OG2 14 14 13
66 Javid MO1 12 14 13 MO2 12 13 14
逻辑是每个Id都有不同的值,我想为它们生成列。谢谢你的帮助。
我们可以创建一个序列列,然后使用pivot_wider
library(tidyr)
library(dplyr)
library(data.table)
library(stringr)
df %>%
mutate(nm1 = rowid(Id, Name)) %>%
pivot_wider(names_from = nm1, values_from = Class:G1)%>%
select(Id, Name, order(as.integer(str_remove(names(.)[-(1:2)], ".*_"))) + 2)
与产出
# A tibble: 4 x 10
# Id Name Class_1 bc1_1 M1_1 G1_1 Class_2 bc1_2 M1_2 G1_2
# <int> <chr> <chr> <int> <int> <int> <chr> <int> <int> <int>
#1 23 Smith A1 13 13 12 A11 12 13 12
#2 19 John Z1 12 14 12 Z11 12 12 12
#3 33 Rose OG1 14 13 14 OG2 14 14 13
#4 66 Javid MO1 12 14 13 MO2 12 13 14