我有一个看起来像这样的数据框
以下数据集中的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
如果有人可以帮助,我会很感激,请!
答案 0 :(得分:2)
使用R
和tidyverse
;主要技巧是使用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)