将不同长度的列值拆分为新的列/功能

时间:2019-06-25 10:08:41

标签: python r pandas dplyr tidyr

我有一个看起来像这样的数据框

以下数据集中的f可以是字母数字单词,即f = [A-z] +

                 flags       perf
1   -f1 -arm -loop -f12=2.5  100
2                  -f1 -f44  45
3         -f12=1.89 -f1 -fA  450
4            -stkDump -fA56  590

标志列中的每个项目都是一个字符串。我想将此数据帧转换为类似的内容:在上面的示例中,某些标志可以具有值范围,例如f12 ,而其他标志只是开/关标志。

  f1 arm loop  f12  f44  fA stkDump fA56 perf
1  1  1  1     2.50   0  0   0       0  100
2  1  0  0     0.00   1  0   0       0  203
3  1  0  0     1.89   0  1   0       0   45
4  0  0  0     0.00   0  0   1       1  590

如果有人可以帮助,我会很感激,请!

1 个答案:

答案 0 :(得分:2)

使用Rtidyverse;主要技巧是使用tidyr::separate_rows根据空间将flags转换为一列和多行,然后使用stringr::str_extract提取重要信息,然后再转换回宽格式。

library(dplyr)
library(stringr)
library(tdiyr)
df %>% 
   rownames_to_column(var="id_row")  %>% 
   separate_rows(flags,sep = '\\s') %>% 
   mutate(val=str_extract(flags,'\\d+\\.\\d+'), key=str_extract(flags,'f[0-9A-z]+')) %>% 
   mutate(val=ifelse(is.na(val),1,val)) %>% 
   dplyr::select(-flags) %>% spread(key, val, fill = 0)

    id_row perf f1  f12 f2 f44 f9 fA fA56 fAe
  1      1  100  1  2.5  1   0  1  0    0   0
  2      2   45  1    0  0   1  0  0    0   0
  3      3  450  1 1.89  0   0  0  1    0   0
  4      4  590  0    0  0   0  0  0    1   1

数据

df <- read.table(text ="
                   flags perf
  1   '-f1 -f2 -f9 -f12=2.5'  100
                   2               '-f1 -f44'   45
                   3      '-f12=1.89 -f1 -fA'  450
                   4            '-fAe -fA56'  590
                   ",header = TRUE, stringsAsFactors = FALSE)