2016-02-28 52 views
1

我目前有一個數據幀如下:的R - 結合列在特定條件

groups <- data.frame(name=paste("person",c(1:27),sep=""), 
assignment1 = c("F","A","B","H", "A", "E", "D", "G", "I", "I", "E", "A", "D", "C", "F", "C", "D", "H", "F", "H", "G", "I", "G", "C", "B", "E", "B"), 
assignment2 = c("H", "F", "F", "D", "E", "G", "A", "E", "I", "C", "A", "H", "G", "B", "I", "C", "E", "I", "C", "A", "B", "B", "G", "D", "H", "F", "D"),stringsAsFactors = FALSE) 

它會看起來像這樣: enter image description here


我想創建一個列表,每個人只包含他已經工作過的人。例如,PERSON1是組F和H分別第一和第二分配


組F於第一分配的構件{ 「PERSON1」, 「person15」, 「person19」 }
第二組作業的成員D爲{「person1」,「person12」,「person25」}

我想創造PERSON1矢量像

{ 「person15」, 「person19」, 「person12」, 「person25」}

任何人都知道一個方便的方法來做到這一點在R?
任何幫助將不勝感激。提前致謝。

+1

可能是你應該檢查'庫(IGRAPH)' – akrun

回答

1

你可以這樣做:

teammates <- lapply(1:nrow(groups), function(i) { 
    assig1 <- subset(groups, assignment1 == groups$assignment1[i])$name 
    assig2 <- subset(groups, assignment2 == groups$assignment2[i])$name 
    unq_set <- unique(c(assig1, assig2)) 
    return(setdiff(unq_set, groups$name[i])) 
}) 

這需要行索引的矢量,併爲每一個應用的功能是:a)獲取name S的那些作業1 & 2匹配給定的行,b)獲得這些的唯一超集,c)返回那個,圍繞組建立的人的name

輸出是像這樣的列表:

[[1]] 
[1] "person15" "person19" "person12" "person25" 

[[2]] 
[1] "person5" "person12" "person3" "person26" 

[[3]] 
[1] "person25" "person27" "person2" "person26" 

...等等

更多簡潔,下面是等效的(雖然爲了內部列表項可能會有所不同)。相同的邏輯@ user5219763的答案子集,但setdiff部分是很重要的

teammates <- lapply(1:nrow(groups), function(i) { 
    setdiff(
    with(groups, name[assignment1 == assignment1[i] | 
         assignment2 == assignment2[i] ]), 
    groups$name[i]) 
}) 
-1

你可以使用is.element()

workedWith <- function(index,data=groups){ 
    data[is.element(data[,2],data[index,2]) | is.element(data[,3],data[index,3]),1] 
} 

lapply(X = seq(1:nrow(groups)),FUN = workedWith) 
+0

這隻適用於一個人。我們可以一次將所有27人分開嗎? – SundayCat

+0

我編輯了我的答案以適用於所有行。正如其他人指出的,您可以通過兩倍的代碼量和一些額外的軟件包來實現相同的結果。 – user5219763

0

下面是使用dplyr和tidyr一個解決方案:

library(dplyr) 
library(tidyr) 
groups %>% 
    gather(var, val, -name) %>% 
    unite(comb, var, val) %>% 
    left_join(.,., by = 'comb') %>% 
    group_by(name.x) %>% 
    summarise(out = list(name.y)) 

繁重使用之前的left_join我們正在整合完成列,以便我們可以在例如assignment1_f上合併。輸出包含自身,並且不會因爲欺騙而糾正 - 這取決於您。

然而,隨着@akrun說,如果你做了很多這方面的東西,使用igraph