2016-02-28 54 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