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'?
答案 0 :(得分:0)
这是一个较旧的问题,但我本人(今天)有此问题,然后来到这里发现未解决的问题。我想分享以下是我要分享的解决方案的步骤:
由于我缺乏一般创造力,因此我的字符串将是字母的随机样本。
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
利用this answer用户g-grothendieck的知识,我得出了这个解决方案,原谅 ugly
df %>%
rowwise() %>%
mutate(alphabetical = paste(sort(unlist(strsplit(paste(firststring, secondstring, sep = " "), " "))), collapse = " "))
如您所见,变量保持其原始顺序,但是新列“字母”为我们提供了我们希望实现的元素明智的字母顺序。
# 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)))
应该有效