я следующий столбец «Имена» в моем dataframeR: сортировать буквы в векторе строк в алфавитном случае чувствительного порядке
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
Есть 4 значения в результате комбинации VecA
я хотел бы закажите каждую букву каждого имени, чтобы в конце у меня осталось только три разных имени, таких как 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, каков должен быть результат? – Heroka
Я добавил вопрос соответственно – user2386786