我正在尝试使用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从其余列名中删除前缀,以填充谐波列。但是,我正在努力将它们正确地整合在一起。
任何帮助将不胜感激!
答案 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
,因此正则表达式(.*?)
)中的该部分作为单独的列名使用。