R - 按特定条件组合列

时间:2016-02-28 20:03:21

标签: r

我目前有一个数据框如下:

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"),
    }
}

它看起来像这样: enter image description here


我想为每个只包含他已经合作过的人的人创建一个列表。例如,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中执行此操作的便捷方法吗?
任何帮助将不胜感激。提前谢谢。

3 个答案:

答案 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)