需要按字母顺序连接列表

时间:2017-02-04 01:09:49

标签: r

R比较新,但我有一个名单列表(每个都在一个单独的列中),我想按字母顺序合并到一个列表中

X <- c("ringo","paul","john","george")

预期结果:("george", "john","paul","ringo")

我尝试了几种不同的方法,包括:

Arrange(x)
Sort(unlist(x)) 

手动标记顺序,然后尝试使用偏移量

索引元素
x <- c("ringo","4","paul","3","john","2","george","1")

Which(x == 1)

但到目前为止还没有运气。为蹩脚的解释道歉

随访:

实际数据在数据框pbptop中设置如下:

a1.num  a2.num
paul    john
ringo   george

使用paste,list_concat或cbind基本上给了我以下内容:

x <- paste0(pbptop$a1.num,pbptop$a2.num)
[1] pauljohn
[2] ringogeorge

我想要的是在每个列表或字符串中按字母顺序排列

[1]johnpaul
[2]georgeringo

> require(gtools)
> x <- paste0(pbptop$a1.num,pbptop$a2.num)
> mixedsort(x)

不幸的是,mixedsort只是按字母顺序排列了列表而不是每个列表,我无法让其他解决方案起作用。

paste(sort(pbptop$a1.num,pbptop$a2.num), collapse = ", ")
Error in sort(pbptop$a1.num, pbptop$a2.num) : 
  'decreasing' must be a length-1 logical vector.
Did you intend to set 'partial'?

3 个答案:

答案 0 :(得分:0)

解决方案:

这是一个较旧的问题,但我本人(今天)有此问题,然后来到这里发现未解决的问题。我想分享以下是我要分享的解决方案的步骤:

1)创建一个reprex示例:

由于我缺乏一般创造力,因此我的字符串将是字母的随机样本。

set.seed(42) # the answer to the universe
n <- 50
string_a <- sample(letters, n, replace = TRUE)
string_b <- sample(letters, n, replace = TRUE)
string_c <- sample(letters, n, replace = TRUE)

firststring <- paste0(string_a, string_b, string_c)
secondstring <- paste0(string_b, string_c, string_a)
rm(list = ls()[grep("string_", ls())])

df <- tibble(
  firststring = firststring,
  secondstring = secondstring
)
head(df)
# A tibble: 6 x 2
# firststring secondstring
# <chr>       <chr>       
# 1 qcd         cdq         
# 2 exy         xye         
# 3 awd         wda         
# 4 yqg         qgy         
# 5 juj         ujj         
# 6 dzr         zrd

2)解决方案

利用this answer用户g-grothendieck的知识,我得出了这个解决方案,原谅 ugly

df %>%
  rowwise() %>% 
  mutate(alphabetical = paste(sort(unlist(strsplit(paste(firststring, secondstring, sep = " "), " "))), collapse = " "))

3)输出:

如您所见,变量保持其原始顺序,但是新列“字母”为我们提供了我们希望实现的元素明智的字母顺序。

# A tibble: 50 x 3
# Rowwise: 
   firststring secondstring alphabetical
   <chr>       <chr>        <chr>       
 1 qcd         cdq          cdq qcd     
 2 exy         xye          exy xye     
 3 awd         wda          awd wda     
 4 yqg         qgy          qgy yqg     
 5 juj         ujj          juj ujj     
 6 dzr         zrd          dzr zrd     
 7 rrm         rmr          rmr rrm     
 8 zfu         fuz          fuz zfu     
 9 qfv         fvq          fvq qfv     
10 obs         bso          bso obs     
# ... with 40 more rows

答案 1 :(得分:-1)

library(dplyr)

a1.num  a2.num
paul    john
ringo   george

pbptop$concat <- paste(pbptop$a1.num, pbptop$a2.num)

现在应该看起来像:

a1.num  a2.num  concat
paul    john    pauljohn
ringo   george  ringogeorge

pbptop <- pbptop %>% arrange(concat)

应该这样做。

或者,而不是使用pbptop $ concat&lt; - paste(...) 你可以在下面的dplyr管道示例中使用mutate

整个dplyr中的东西应该是这样的..

pbptop_alphabetical <- pbptop %>%
                          mutate(concat = paste(a1.num, a2.num)) %>%
                          arrange(concat)

答案 2 :(得分:-1)

你想在a1.num和a2.num列中取名,然后根据这两个中的哪一个来获取。

这样做:

library(dplyr)
pbptop_alphabetical <- pbptop %>%
                          mutate(concat = ifelse(a1.num < a2.num, paste(a1.num, a2.num), paste(a2.num, a1.num)))

应该有效