提问人:Mohit 提问时间:11/11/2023 最后编辑:Mohit 更新时间:11/13/2023 访问量:191
R:在 data.table 中包含具有特定条件的列
R: include a column in a data.table with certain conditions
问:
这个问题是我之前提出的问题的延伸。
问题:我希望将另一个表中的一列包含在主表中。
这是我的数据:
library(data.table)
zz<-100000;
dTTBL <- data.table(abcd = c(paste0(rep(c("a","b"),zz/2),round(runif(zz)*100,0))), efgh = c(paste0(rep(c("a","b"),zz/2),round(rnorm(zz)*100,0))), ijkl = c(paste0(rep(c("a","b"),zz/2),round(rchisq(zz,1)*100,0))),qrst = c(paste0(rep(c("a","b"),zz/2),round(rchisq(zz,1)*100,0))),uvwx = c(paste0(rep(c("a","b"),zz/2),round(rchisq(zz,1)*100,0))),mnop = c(paste0(rep(c("a","b"),zz/2),round(rpois(zz,0.5)*100,0))));
zy<-10;
SNM<-data.table(ijkl = c(paste0(rep(c("a","b"),zy/2),round(rchisq(zy,1)*100,0))), abcd = c(paste0(rep(c("a","b"),zy/2),round(runif(zy)*100,0))));
SNM<-rbind(SNM, data.table(ijkl = NA, abcd = NA))
wxyz = paste0(rep(c("a"),zy+1),round(rlnorm(zy+1,0.5)*100,0))
mnop = c(rep(NA,zy),"a0");
SNM<-cbind(mnop,SNM,wxyz)
这是我想做的事情: 代码工作正常,没有任何问题。
答
SNM[is.na(SNM)]<-"";
SNM[, dcba := apply(.SD, 1, \(x) paste(which(x != ""), collapse = ""))]
dTTBL[, wxyz := fcoalesce(lapply(split(SNM, by = "dcba"), \(x) { x[, .SD, .SDcols = \(x) !all(x == "")][dTTBL, wxyz, on = .NATURAL]}))]
但是,我想对上述答案代码进行更多改进。
如果你还没有读过我之前的问题,我又写了一遍。
DTTBL
data.table 具有某些列,它需要从另一个映射表中包含 1 个或更多列,该映射表具有 的几列或全部列,但将有 1 个或多个额外的列。并且只需要将这些额外的列包含在SNM
DTTBL
DTTBL
但是,存在并发症。
- 如果中有多个列,并且对于任何行只有一个条目,则对于该特定行,只需考虑该列进行映射,该列仅具有该值。这可以是 1 列或多列。
SNM
为了证明这一点,一个很好的例子是 data.table 中的列。所以只有列才能被考虑映射新列的值。mnop
SNM
mnop
wxyz
同样,1.2.3...或许多列。我的意思是足够动态和灵活。
- 列不需要排序。
Answer 代码需要以与 中相同的方式对列进行排序。因此,我需要在这里进行改进。SNM
DTTBL
在我的答案代码中,只能包含 1 个新列,我希望它能够灵活并适应尽可能多的列。
在我的答案代码中,需要包含的新列是固定的或已被指定(请参阅放在那里)我希望它是动态的,而无需修复任何内容。以某种方式识别哪些是新的并包括它们。
wxyz
数据集很大,这只是我准备的一个样本。
DTTBL
有时由于人为错误,映射表或可能包含重复的行。理想情况下,代码不应在这种情况下运行。我的答案代码考虑了这种不规则性。
SNM
可能我要问的是可以通过混合我之前问的这两个问题来实现。
答: 暂无答案
评论