2016-01-08 74 views
0

我有以下列在我的數據幀「名稱」R:在字母區分大小寫順序的一串向量排序字母

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="")) 

它打破了字符串特徵向量,令它們,並將它們粘貼到一起。