Creating edge list with additional variables in R

情到浓时终转凉″ 提交于 2019-12-02 13:24:53

Try

  res <- do.call(rbind,lapply(split(df1, df1$ID), function(x) {
        m1 <- if(length(x$item)>=2)
          t(combn(as.character(x$item),2)) 
           else NULL
        if(!is.null(m1)) 
       data.frame(ID=unique(x$ID), sex=unique(x$sex), m1)}))
 row.names(res) <- NULL
 res
 #   ID    sex X1 X2
 #1 ID1   male  a  b
 #2 ID1   male  a  c
 #3 ID1   male  b  c
 #4 ID2 female  a  c
 #5 ID4   male  b  a

I feel like already solved this once, but here's a possible solution using data.table and it's new (v >= 1.9.5) tstrsplit function

library(data.table)
setDT(df1)[, if(.N > 1) tstrsplit(combn(as.character(item),
              2, paste, collapse = ";"), ";"),
            .(ID, sex)]

#     ID    sex V1 V2
# 1: ID1   male  a  b
# 2: ID1   male  a  c
# 3: ID1   male  b  c
# 4: ID2 female  a  c
# 5: ID4   male  b  a
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!