0

我有这样的数据:

ID=c(rep("ID1",3), rep("ID2",2), "ID3", rep("ID4",2))
sex=c(rep("male",3), rep("female",2), "female", rep("male",2))
item=c("a","b","c","a","c","a","b","a")

df1 <- data.frame(ID,sex,item)
df1
  ID    sex item
1 ID1   male    a
2 ID1   male    b
3 ID1   male    c
4 ID2 female    a
5 ID2 female    c
6 ID3 female    a
7 ID4   male    b
8 ID4   male    a

我需要它作为这样的边缘:

head(nodes)

  ID    sex    V1  V2
1 ID1   male    a  b
2 ID1   male    b  c
3 ID1   male    a  c
4 ID2 female    a  c
5 ID4   male    b  a

在@akrun 的帮助下,我可以获得 V1 和 V2 列:

lst <- lapply(split(item, DG), function(x) if(length(x) >=2) t(combn(x,2)) else NULL) 
nodes=as.data.frame(do.call(rbind,lst[!sapply(lst, is.null)]) )

但是我怎么能从原始df中“带走”ID和一些其他变量(性别、年龄等)并将它们作为“节点”中的“性别”等列?

4

2 回答 2

3

我觉得已经解决了一次,但这是一个可能的解决方案data.table,它是新的(v >= 1.9.5tstrsplit函数

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
于 2015-02-11T09:06:37.153 回答
2

尝试

  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
于 2015-02-11T08:07:56.910 回答