2016-01-08 3 views
0

я следующий столбец «Имена» в моем 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 я могу суммировать данные себе, однако, упорядочение должно быть немного отличается, как уже упоминалось выше. Это возможно? Извините за то, что вы не опубликовали весь этот набор в начале, я подумал, что сам выясню, как только я получу строки в правильном порядке.

+0

Я предполагаю, что имена имеют несколько символов и т. Д. Если у вас есть bA, каков должен быть результат? – Heroka

+0

Я добавил вопрос соответственно – user2386786

ответ

0

Вы можете попробовать:

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

Он разбивает строки в символьных векторов, упорядочивает их и приклеивает их обратно вместе.