【问题标题】:R: sort letters in a string vector in alphabetical case sensitive orderR:按字母大小写敏感顺序对字符串向量中的字母进行排序
【发布时间】:2016-04-13 01:19:31
【问题描述】:

我的数据框中有以下列“名称”

library(dplyr)
VecA<-c("A","a")      
c<-as.data.frame(expand.grid(VecA,VecA))%>%
mutate(Names=paste(.$Var1,.$Var2,.$Var3,.$Var4,sep=""))%>%
select(Names)
> c
  Names
1    AA
2    aA
3    Aa
4    aa

VecA 组合的结果有 4 个值我想对每个名称的每个字母进行排序,以便最后我只剩下三个不同的名称,例如 c("AA","Aa","aa)。这意味着“aA”和“Aa”是相同的。 这可以实现吗?

编辑: 下面发布的答案符合我的要求,但不幸的是我无法将它们用于我的较大字符串。 假设

VecA<-c("A","a")
VecB<-c("B","b")
c<-as.data.frame(expand.grid(VecA,VecA,VecB,VecB))%>%mutate(Names=paste(.$Var1,.$Var2,.$Var3,.$Var4,sep=""))%>%select(Names)

@NicE 发布的答案 我明白了

c$Names2<-sapply(c$Names,function(x)paste0(sort(unlist(strsplit(x,"")),decreasing=T),collapse=""))
c
   Names Names2
1   AABB   BBAA
2   aABB   BBAa
3   AaBB   BBAa
4   aaBB   BBaa
5   AAbB   BbAA
6   aAbB   BbAa
7   AabB   BbAa
8   aabB   Bbaa
9   AABb   BbAA
10  aABb   BbAa
11  AaBb   BbAa
12  aaBb   Bbaa
13  AAbb   bbAA
14  aAbb   bbAa
15  Aabb   bbAa
16  aabb   bbaa

但是,我需要它们的顺序为AABB,AaBB,AaBB,aaBB,AABb,依此类推。 之后像这样删除重复的值,我遇到了另一个问题。

c <- data.frame(names=apply(expand.grid(VecA,VecA,VecB,VecB), 1, paste, collapse=""), stringsAsFactors=F)
c[!duplicated(lapply(strsplit(c$names, ""), sort), fromLast = T),, drop=F]

   names
1   AABB
3   AaBB
4   aaBB
9   AABb
11  AaBb
12  aaBb
13  AAbb
15  Aabb
16  aabb

这种情况下的问题是重复的行被删除了。在这种情况下,我需要的是第二行指示值的总和,如果存在与最初 16 行中的每一行相关联的数据的列。因此,一个高级示例可能如下所示:

VecA<-c("A","a")
VecB<-c("B","b")
c<-as.data.frame(expand.grid(VecA,VecA,VecB,VecB))%>%mutate(Names=paste(.$Var1,.$Var2,.$Var3,.$Var4,sep=""))%>%select(Names)%>%mutate(Value=runif(NROW(.),1,100))
c
   Names    Value
1   AABB 69.19903
2   aABB 28.75896
3   AaBB 61.45903
4   aaBB 78.43504
5   AAbB 28.58105
6   aAbB 41.33014
7   AabB 29.75036
8   aabB 77.41428
9   AABb 85.59857
10  aABb 61.20740
11  AaBb 57.77745
12  aaBb 89.71112
13  AAbb 11.68326
14  aAbb 30.67187
15  Aabb 48.28885
16  aabb 44.82100

根据@NicE 提供的答案,我可以自己总结数据,但是如上所述,排序需要稍有不同。那可能吗?很抱歉没有在一开始就发布整套,我想一旦我把字符串按正确的顺序弄明白了,我会自己弄明白的。

【问题讨论】:

  • 我猜名字有多个字符等。如果你有 bA,结果应该是什么?
  • 我相应地添加了问题

标签: r string alphanumeric


【解决方案1】:

你可以试试:

sapply(c$Names,function(x)paste0(sort(unlist(strsplit(x,"")),decreasing=T),collapse=""))

它将字符串分解为字符向量,对它们进行排序并将它们粘贴在一起。

【讨论】:

    猜你喜欢
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多