2014-09-10 20 views
2

我有這樣ř找到一個對一COLS連桿之間2

df <- data.frame(g1=c("x1","x2","x2","x3","x4"), 
       g2=c("y1","y1","y2","y3",NA), 
       stringsAsFactors = FALSE) 

一個數據幀中的每一行表示一個特定的x被連接到相同行的一定的收率

我該如何找到有多少x和y是唯一鏈接的,不包括na?

就像在這種情況下,只有1個獨特的連接x3到y3。

謝謝。

回答

0

有更好的方法來做到這一點,但這是有效的。

Df[sapply(Df2[,1], function(x) (sum(x == (d <- sapply(Df, substring, first = 2))[,2], na.rm=T)==1)&(sum(x == d[,1], na.rm=T)==1)),] 
> g1 g2 
    x3 y3 
2

你可以得到所有的配對與table()

tt <- do.call(table, Df) 

,然後找到/匹配具有零在細胞的共同行中的其餘列這些細胞

uv <- arrayInd(which(rowSums(tt)[row(tt)] == 1 & colSums(tt)[col(tt)]==1 & tt>0), .dim=dim(tt)) 

現在提取這些單元格的名稱

cbind(rownames(tt)[uv[,1]], colnames(tt)[uv[,2]]) 

#  [,1] [,2] 
# [1,] "x3" "y3" 

所以在這裏我們得到了X3,Y3配對您需要的形式您的樣品

3

當我明白你的問題,你看你的數據幀的行,其中的g1值和g2值都是唯一的。在R中可以與duplicated功能檢查獨特的價值觀:

subset(df, !duplicated(g1) & !duplicated(g1, fromLast=TRUE) & !is.na(g1) & 
      !duplicated(g2) & !duplicated(g2, fromLast=TRUE) & !is.na(g2)) 
# g1 g2 
# 4 x3 y3 
1

也許你可以使用igraph。如果在圖中xy是唯一鏈接的,它們將不會連接到任何其他節點 - 因此該圖將具有clusters。因此,目標是確定大小爲2的線索並提取節點名稱。

# extend your data a little to include another unique link 
df <- data.frame(g1=c("x1","x2","x2","x3","x4","x7"), 
       g2=c("y1","y1","y2","y3",NA, "y8"), 
       stringsAsFactors = FALSE) 

library(igraph) 
g <- graph.data.frame(na.omit(df[,1:2])) 

plot(g) 

by(V(g)$name, clusters(g)$membership, as.character) [clusters(g)$csize==2] 
#$`2` 
#[1] "x3" "y3" 

#$`3` 
#[1] "x7" "y8" 

編輯跟進評論

可以使用V(G)$顏色指定顏色(和其他屬性)的節點。您可以有條件地分配這些。

所以上色的節點用單鏈路不同

b <- by(V(g)$name, clusters(g)$membership, as.character) [clusters(g)$csize==2] 

V(g)$color <- ifelse(V(g)$name %in% unlist(b), "red", "blue") 

plot(g) 

或者上色每個集羣不同

V(g)$color <- c("red", "blue", "green")[clusters(g)$membership] 

plot(g) 

看一看?V?clusters?plot.igraph查看更多選項

+0

這非常有趣。有沒有辦法將不同的顏色應用於那些一對一的對,不管是頂點填充還是邊界?謝謝@ user20650 – santoku 2014-09-11 12:30:53

+0

@santoku;不客氣。請參閱編輯節點的着色 – user20650 2014-09-11 12:42:39