我目前有一个数据框如下:
pub fn from<T:Pattern>(from: T) -> Result<Tag, &'static str> {
match from {
'A'|"A" => Ok(Tag::ChA),
'B'|"B" => Ok(Tag::ChB),
'C'|"C" => Ok(Tag::ChC),
'D'|"D" => Ok(Tag::ChD),
'T'|"Tmpr" => Ok(Tag::Tmpr),
'Y'|"Batt" => Ok(Tag::Batt),
'L'|"Acc" => Ok(Tag::Acc),
_ => Err("Error: unknown channel"),
}
}
我想为每个只包含他已经合作过的人的人创建一个列表。例如,person1分别位于组F和H ,分别用于第一和第二作业
<第一次分配的群组F 的成员 {&#34; person1&#34;,&#34; person15&#34;,&#34; person19& #34;} 即可。
第二次分配的小组D 的成员是 {&#34; person1&#34;,&#34; person12&#34;,&#34; person25&#34; }
我想为person1创建一个像
的矢量{&#34; person15&#34;,&#34; person19&#34;,&#34; person12&#34;,&#34; person25&#34;} 。
任何人都知道在R中执行此操作的便捷方法吗?
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分: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)获得分配1和1的那些name
的函数。 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 :(得分: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
答案 2 :(得分:-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)