我有一个包含一列字符的数据框。我正在尝试交换字符的顺序。例如,如果我有一个如下所示的数据框:
df <- data.frame(
vars = c('Sepal.Width:Petal.Length' ,
'Sepal.Length:Sepal.Length',
'Sepal.Length:Petal.Length',
'Petal.Length:Sepal.Length',
'Petal.Width:Sepal.Length ',
'Sepal.Length:Petal.Width ',
'Petal.Width:Petal.Length ',
'Sepal.Width:Sepal.Width ',
'Sepal.Width:Sepal.Length '),
value = c(0.18750000,
0.12500000,
0.18750000,
0.09791667,
0.09791667,
0.06666667,
0.02500000,
0.05625000,
0.15625000)
)
我们可以在 var
列中看到第 3 行是 Sepal.Length:Petal.Length
,第 4 行是 Petal.Length:Sepal.Length
。我要做的是安排数据框,使名称的顺序相同。因此,对于第 3 行和第 4 行,我想重新排列名称,比如说,按字母顺序排列,以便我们得到:Petal.Length:Sepal.Length
两行。
重新排列完整的数据框后,我想要的输出看起来像这样:
var value
1 Petal.Length:PetalWidth. 0.02500000
2 Petal.Length:Sepal.Length 0.09791667
3 Petal.Length:Sepal.length 0.18750000
4 Petal.Length:Sepal.Width 0.18750000
5 Petal.Width:Sepal.Length 0.09791667
6 Petal.Width:Sepal.Length 0.06666667
7 Sepal.Length:Sepal.Length 0.09791667
8 Sepal.Length:Sepal.Width 0.15625000
9 Sepal.Width:Sepal.Width 0.05625000
最佳答案
您可以使用 tidyverse 函数将“vars”列分开,按字母顺序对所有内容进行排序,然后将命名重新组合在一起:
library(tidyverse)
result <- df %>%
rowwise() %>%
mutate(
separated = list(sort(strsplit(vars, ':')[[1]])),
trimmed = list(gsub('(^ +| +$)', '', separated)),
reordered = paste(trimmed, collapse = ':')
) %>%
select(vars = reordered, value)
vars value
<chr> <dbl>
1 Petal.Length:Sepal.Width 0.188
2 Sepal.Length:Sepal.Length 0.125
3 Petal.Length:Sepal.Length 0.188
4 Petal.Length:Sepal.Length 0.0979
5 Petal.Width:Sepal.Length 0.0979
6 Petal.Width:Sepal.Length 0.0667
7 Petal.Length:Petal.Width 0.025
8 Sepal.Width:Sepal.Width 0.0562
9 Sepal.Length:Sepal.Width 0.156
关于r - 如何在 R 中交换部分字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71551404/