我的数据帧为58207 x6。它是由于值的不同组合而产生的。我使用tidyverse将第一列分组,并使用do()将每个唯一的第一列值分配给从第3列到第6列的特定数据帧。但是,我无法弄清楚如何对第2列执行相同的操作,所不同的是只需要列表中存储的唯一值,而无需重复。
这是数据帧的开头。
# A tibble: 58,207 x 6
id pfam go_id name nmspace linkage_type
<chr> <fct> <fct> <fct> <fct> <fct>
1 O00273_~ PF020~ GO:000~ cytoplasm cellular_compo~ IEA
2 O00273_~ PF020~ GO:000~ cytosol cellular_compo~ IDA
3 O00273_~ PF020~ GO:000~ plasma membrane cellular_compo~ IDA
4 O00273_~ PF020~ GO:000~ nuclear chromatin cellular_compo~ IDA
5 O00273_~ PF020~ GO:000~ apoptotic process biological_pro~ IEA
6 O00273_~ PF020~ GO:000~ protein binding molecular_func~ IPI
任何有关如何获取第二列上每个group_by(id)的levels()值并将其存储到与该id对应的列表的建议都将受到赞赏。
我是新来的。如果您对如何处理此类数据有任何建议,请告诉我。基本上,我希望以后可以对不同的ID进行比较。
答案 0 :(得分:0)
这对您来说还行吗?
# dummy data, using data.table package, converting from tibble
library(data.table)
library(tibble)
library(gtools)
df <- tibble(id = rep(c("id1", "id2", "id3"), each=3),
X1 = c("a", "f", "b",
"b", "a", "e",
"a", "f", "f"))
dt <- as.data.table(df)
dt[]
# retaining data structure
out1 <- dt[, .(unique.X1 = unique(X1)), by = id]
out1[]
# as a list
out2 <- dt[, .(unique.X1 = list(unique(X1))), by = id]
out2[]
# back to original format
out2.df <- as.tibble(out2)
out2.df
# EDIT: getting unique combinations
ids <- unique(df$id)
lookup <- as.data.table(gtools::combinations(length(ids), 2))
lookup[, V1 := ids[lookup$V1]][, V2 := ids[lookup$V2]]
setnames(lookup, c("V1", "V2"), c("ID1", "ID2"))
lookup[, index := .I]
setkey(dt, id)
joined <- lookup[, .(intersect = list(intersect(dt[J(ID1), X1], dt[J(ID2), X1]))), by=index]
out <- merge(joined, lookup, by="index")
out[, index := NULL]
out[]