【发布时间】: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