带组的pivot_longer,并删除列名前缀

时间:2020-07-03 12:32:35

标签: r tidyr

我正在尝试使用pivot_longer将数据帧从宽格式转换为长格式。

原始数据帧为:

# List of columns to check
columns = ['col1', 'col2', 'col3']
# List of words to check
words = ['test', 'TEST', 'Test']

test_remove = df[eval('|'.join(f"df['{col}'].str.contains('{word}')"
                               for col in columns
                               for word in words))]

外观如下:

df.start <- structure(list(amprise = 0.015, ampfull = 0.005, ampfall = 0.03, freq1 = 250L, freq2 = 500L, freq3 = 750L, relamp1 = 0.01, relamp2 = 0.3, relamp3 = 0.02), class = "data.frame", row.names = c(NA, -1L))

我想将其压缩为六列:

> df.start
  amprise ampfull ampfall freq1 freq2 freq3 relamp1 relamp2 relamp3
1   0.015   0.005    0.03   250   500   750    0.01     0.3    0.02

this post我了解到,我可以使用> df.end harmonic amprise ampfull ampfall freq relamp 1 1 0.015 0.005 0.03 250 0.01 2 2 0.015 0.005 0.03 500 0.30 3 3 0.015 0.005 0.03 750 0.02 将那组列保留为宽格式。

我还看到我应该能够使用cols = -c("amprise", "ampfull", "ampfall")中的regex从其余列名中删除前缀,以填充谐波列。但是,我正在努力将它们正确地整合在一起。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

您可以使用names_pattern

tidyr::pivot_longer(df.start, 
                    cols = -c("amprise", "ampfull", "ampfall"), 
                    names_to = c('.value', 'harmonic'), 
                    names_pattern = '(.*?)(\\d+)')

#  amprise ampfull ampfall harmonic  freq relamp
#    <dbl>   <dbl>   <dbl> <chr>    <int>  <dbl>
#1   0.015   0.005    0.03 1          250   0.01
#2   0.015   0.005    0.03 2          500   0.3 
#3   0.015   0.005    0.03 3          750   0.02

当我们在.value中使用names_to时,我们希望保留一部分原始列名作为整形数据框中的列。使用names_pattern,我们可以定义要在其中提取列名称的组。

(.*?)(\\d+)在这里我们定义2组列名。第一组(.*?)提取所有内容,直到遇到第二个组的数字(\\d+)。由于我们在第一部分中使用了.value,因此正则表达式(.*?))中的该部分作为单独的列名使用。