2016-08-09 26 views
0

我有一个看起来像这样的数据帧:列列,但持有共同的列名

data.frame(group1_a_mu = 10, group1_b_sd = 4, group1_c_xx = 5, group2_a_mu=1, group2_b_sd=2, gorup2_c_xx = 14, stringsAsFactors = FALSE) 

group1_a_mu group1_b_sd group1_c_xx group2_a_mu group2_b_sd gorup2_c_xx 
1  10  4  5  1  2  14 

,我想将它转换成这样:

  mu sd  xx 
group1  10 4  5 
group2  1  2 14 

怎么看去做?

+0

请注意,您的原始数据框中有一个拼写错误,您有'gorup2_c = 14',它应该是'group2_c = 14'。 – steveb

回答

1

你可以尝试以下方法(基于原帖中的数据):

library(dplyr) 
library(tidyr) 
data.frame(group1_a = 10, group1_b = 4, group1_c = 5, group2_a=1, group2_b=2, group2_c = 14, stringsAsFactors = FALSE) %>% 
    gather(key, val) %>% 
    separate(key, c('group_name', 'subgroup_name'), sep = '_') %>% 
    spread(subgroup_name, val) 

## group_name a b c 
## 1  group1 10 4 5 
## 2  group2 1 2 14 

的局面,其中有2个_字符(更新后),以下办法临时修改_字符。另一种方法是在separate正则表达式(sep)中使用向前看或背后的运算符。

data.frame(group1_a_mu = 10, group1_b_sd = 4, group1_c_xx = 5, group2_a_mu=1, group2_b_sd=2, group2_c_xx = 14, stringsAsFactors = FALSE) %>% 
    gather(key, val) %>% 
    mutate(key = sub('_', '|', key)) %>%    ## Temporary change of '_' to '|' 
    separate(key, c('group_name', 'subgroup_name'), sep = '_') %>% 
    spread(subgroup_name, val) %>% 
    mutate(group_name = sub('[|]', '_', group_name)) ## Change back to '_' 

## group_name mu sd xx 
## 1 group1_a 10 NA NA 
## 2 group1_b NA 4 NA 
## 3 group1_c NA NA 5 
## 4 group2_a 1 NA NA 
## 5 group2_b NA 2 NA 
## 6 group2_c NA NA 14 

使用正面看后面的运算符会给出相同的结果。

data.frame(group1_a_mu = 10, group1_b_sd = 4, group1_c_xx = 5, group2_a_mu=1, group2_b_sd=2, group2_c_xx = 14, stringsAsFactors = FALSE) %>% 
    gather(key, val) %>% 
    separate(key, c('group_name', 'subgroup_name'), sep = '(?<=[a-z])_') %>% 
    spread(subgroup_name, val) 
+0

谢谢steve如果名称中有2个“_”字样?请参阅编辑 – user3022875

+0

'sep'参数是一个正则表达式。有可能通过使用前瞻或背后的操作符来做到这一点(我不知道如何做到这一点)。另一种方法是暂时将第一个'_'修改为'|',然后在单独之后将其重新设置为'_'。 – steveb

相关问题