我需要根据组值更改表的格式,但保留整个行值。以下是原始表的示例
Row Atr1 Atr2 Atr3 ValA1 ValA2 ValA3 ValB1 ValB2 ValB3 ValC1 ValC2 ValC3
1 21 SNV T yes yes 100 yes yes 98.1 no yes 100
2 43 SNp C yes no 0 yes no 0.65 yes no 0
3 43 SNV C yes yes 100 yes yes 99.35 yes yes 100
4 47 SNp C yes yes 8.97 yes no 0 yes no 0
我需要将其改为
Row Atr1 Atr2 Atr3 Gr Gr_Val1 Gr_Val2 Gr_Val3
1 21 SNV T A yes yes 100
2 21 SNV T B yes yes 98.1
3 21 SNV T C no yes 100
4 43 SNp C A yes no 0
5 43 SNp C B yes no 0.65
6 43 SNp C C yes no 0
7 43 SNV C A yes yes 100
8 43 SNV C B yes yes 99.35
9 43 SNV C C yes yes 100
10 47 SNp C A yes yes 8.97
11 47 SNp C B yes no 0
12 47 SNp C C yes no 0
因此,在每列中指定了初始组值,但现在应在每一行中指定。关于如何做到这一点的任何想法? 谢谢
答案 0 :(得分:0)
以下答案假定您要转换的列名为"Val[A-Z]+[0-9]+"
;那是" Val"跟随任意数量的大写字母,然后跟随任意数量的数字。在那种情况下,
gather
列生成Key
列,其中包含收集的列名称。mutate
此Key
列使用字符串替换形成两列:Gr
和Gnum
。将创建Gnum
列以匹配结果的列名称(即Gr_Val1
,Gr_Val2
等。)。group_by
Gr
和spread
使用Gnum
作为关键字,将收集的值作为值。使用dplyr
:
library(dplyr)
result <- df %>% gather("Key","Vals",-c(Row:Atr3)) %>%
mutate(Gr=sub("[0-9]+","",sub("Val","",Key)),
Gnum=paste0("Gr_",sub("Val[A-Z]+","Val",Key))) %>%
select(-Key) %>%
group_by(Gr) %>%
spread(Gnum,Vals)
result
符合预期:
print(result)
##Source: local data frame [12 x 8]
##Groups: Gr [3]
##
## Row Atr1 Atr2 Atr3 Gr Gr_Val1 Gr_Val2 Gr_Val3
##* <int> <int> <fctr> <fctr> <chr> <chr> <chr> <chr>
##1 1 21 SNV T A yes yes 100
##2 1 21 SNV T B yes yes 98.1
##3 1 21 SNV T C no yes 100
##4 2 43 SNp C A yes no 0
##5 2 43 SNp C B yes no 0.65
##6 2 43 SNp C C yes no 0
##7 3 43 SNV C A yes yes 100
##8 3 43 SNV C B yes yes 99.35
##9 3 43 SNV C C yes yes 100
##10 4 47 SNp C A yes yes 8.97
##11 4 47 SNp C B yes no 0
##12 4 47 SNp C C yes no 0