R:在 data.table 中包含具有特定条件的列

R: include a column in a data.table with certain conditions

提问人:Mohit 提问时间:11/11/2023 最后编辑:Mohit 更新时间:11/13/2023 访问量:191

问:

这个赏金已经结束了。这个问题的答案有资格获得 +50 声望赏金。赏金宽限期将在 11 小时后结束。Mohit 正在寻找来自信誉良好的来源的答案

这个问题是我之前提出的问题的延伸。

问题:我希望将另一个表中的一列包含在主表中。

这是我的数据:

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]}))]

但是,我想对上述答案代码进行更多改进。

如果你还没有读过我之前的问题,我又写了一遍。

DTTBLdata.table 具有某些列,它需要从另一个映射表中包含 1 个或更多列,该映射表具有 的几列或全部列,但将有 1 个或多个额外的列。并且只需要将这些额外的列包含在SNMDTTBLDTTBL

但是,存在并发症。

  1. 如果中有多个列,并且对于任何行只有一个条目,则对于该特定行,只需考虑该列进行映射,该列仅具有该值。这可以是 1 列或多列。SNM

为了证明这一点,一个很好的例子是 data.table 中的列。所以只有列才能被考虑映射新列的值。mnopSNMmnopwxyz

同样,1.2.3...或许多列。我的意思是足够动态和灵活。

  1. 列不需要排序。

Answer 代码需要以与 中相同的方式对列进行排序。因此,我需要在这里进行改进。SNMDTTBL

  1. 在我的答案代码中,只能包含 1 个新列,我希望它能够灵活并适应尽可能多的列。

  2. 在我的答案代码中,需要包含的新列是固定的或已被指定(请参阅放在那里)我希望它是动态的,而无需修复任何内容。以某种方式识别哪些是新的并包括它们。wxyz

  3. 数据集很大,这只是我准备的一个样本。DTTBL

  4. 有时由于人为错误,映射表或可能包含重复的行。理想情况下,代码不应在这种情况下运行。我的答案代码考虑了这种不规则性。SNM

可能我要问的是可以通过混合我之前问的这两个问题来实现。

匹配另一个表中的表列,以获取 R 中主表中的所需列

R,在具有特定条件的映射表的数据框/data.table 中创建一个附加列

r 数据表

评论


答: 暂无答案