gpt4 book ai didi

r - 在R中将逗号分隔的字符串拆分为(稀疏) bool 矩阵的快速方法

转载 作者:行者123 更新时间:2023-12-05 00:42:28 24 4
gpt4 key购买 nike

我有一个风格的数据框

id choice
----------
1 "(a,b,c)"
2 "(c)"
3 "(a,c)"
4 "(d)"

DF = data.frame(id=c(1,2,3,4), choice=c("(a,b,c))","(c)","(a,c)","(d)"))

我想获得一个带有 bool 列的数据框

id a b c d
----------
1 T T T F
2 F F T F
3 F F T F
4 F F F T

基于 Split comma-separated strings into boolean columns我尝试使用

library(splitstackshape)
cSplit_e(DF, "choice", sep = "[,()]", mode = "binary",
type = "character", fill = 0, drop = TRUE, fixed = FALSE)

但是,我的实际数据帧内存不足(我有大约 1000 万行和大约 150 万个唯一选择值(预先不知道的数字))并且通常也很慢。

因此,我想知道是否有更快、内存效率更高的方法来执行此操作,例如使用 data.tabledplyrmultidplyr 并且也许还以稀疏格式存储 bool 矩阵?

在我的实际数据集中 choice 是可能的氨基酸突变,所以不是 a,b,c, ... 例如

(NSP5_P132H,Spike_H69del,Spike_T95I,Spike_A67V,Spike_N969K,Spike_H655Y,Spike_N856K,N_R203K,Spike_G142D,NSP3_A1892T,Spike_Q954H,N_P13L,NSP3_L1266I,N_R32del,M_Q19E,NSP4_T492I,NSP6_L105del,Spike_N679K,Spike_N764K,Spike_L212I,NSP6_G107del,NSP6_I189V,Spike_T547K,M_D3G,Spike_D796Y,N_G204R,Spike_V143del,M_A63T,Spike_K417N)

而且我没有数据集中可能发生的突变的先验列表 - 所以我不知道我的先验选择(大约有 150 万个独特的选择)...

这是我实际数据集的前 100 行:

library(readr)
DF = read_csv("https://www.dropbox.com/s/v1dhbzmlyudxvyi/DF.csv?dl=1")
DF$id = 1:nrow(DF)

EDIT2:如果不是因为我最终会得到一个包含 150 万列和 1000 万行的数据表,它不再适合内存我的机器。我想最终将它存储为稀疏矩阵真的有必要吗?

最佳答案

你可以试试下面的 dcast + strsplit

dcast(
setDT(DF)[
,
.(choice = Filter(nzchar, unlist(strsplit(choice, "\\W+")))),
id
],
id ~ choice,
fun.aggregate = function(x) length(x) > 0
)

给了

   id     a     b     c     d
1: 1 TRUE TRUE TRUE FALSE
2: 2 FALSE FALSE TRUE FALSE
3: 3 TRUE FALSE TRUE FALSE
4: 4 FALSE FALSE FALSE TRUE

关于r - 在R中将逗号分隔的字符串拆分为(稀疏) bool 矩阵的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73758344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com