首页 > 解决方案 > 您对如何在 R 中管理数据的建议

问题描述

我有一个 58207 x 6 的数据框。它是由不同的值组合产生的。使用 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 进行比较。

标签: r

解决方案


这对你有用吗?

# 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[]

推荐阅读