关于如何在R中管理数据的建议

时间:2019-01-15 16:16:43

标签: r

我的数据帧为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进行比较。

1 个答案:

答案 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[]