R:按字母顺序区分大小写排序字符串向量中的字母

时间:2016-01-08 11:12:18

标签: r string alphanumeric

我有以下专栏"姓名"在我的数据框中

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)。这意味着&#34; aA&#34;和&#34; Aa&#34;是相同的。 这可以实现吗?

修改 以下发布的答案按照我的要求进行,但遗憾的是我无法将它们用于我的大字符串。 假设

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提供的答案中,我能够自己总结数据,但是如上所述,排序需要略有不同。那可能吗?很抱歉没有在开头发布这整套我觉得一旦我按照正确的顺序得到字符串,我会自己弄清楚。

1 个答案:

答案 0 :(得分:0)

你可以尝试:

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

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