R 将data.table中的系数级别分组

R 将data.table中的系数级别分组,r,data.table,R,Data.table,我试图在data.table中组合因子级别,不知道是否有一种data.table-y方法可以这样做 例如: DT = data.table(id = 1:20, ind = as.factor(sample(8, 20, replace = TRUE))) 我想说类型1,3,8属于A组;B组2例,4例;C组为5,6,7 以下是我一直在做的事情,在问题的完整版本中,这是相当缓慢的: DT[ind %in% c(1, 3, 8), grp := as.factor("A")] DT[ind %in

我试图在
data.table
中组合因子级别,不知道是否有一种
data.table
-y方法可以这样做

例如:

DT = data.table(id = 1:20, ind = as.factor(sample(8, 20, replace = TRUE)))
我想说类型1,3,8属于A组;B组2例,4例;C组为5,6,7

以下是我一直在做的事情,在问题的完整版本中,这是相当缓慢的:

DT[ind %in% c(1, 3, 8), grp := as.factor("A")]
DT[ind %in% c(2, 4), grp := as.factor("B")]
DT[ind %in% c(5, 6, 7), grp := as.factor("C")]
另一种方法,由相关问题提出,我想是这样翻译的:

DT[ , grp := ind]
levels(DT$grp) = c("A", "B", "A", "B", "C", "C", "C", "A")
或者(考虑到我有65个底层组和18个聚合组,这感觉有点整洁)

DT[,grp:=ind]
lev更新:
我最近学到了一种更简单的方法,可以从问题中重新关联因子水平,并更仔细地阅读
?水平。无需合并、对应表等。只需将命名的
列表
传递到
级别

levels(DT$ind) = list(A = c(1, 3, 8), B = c(2, 4), C = 5:7)

原始答复: 根据@Arun的建议,我们可以选择将通信创建为一个单独的
数据表,然后将其连接到原始:

match_dt = data.table(ind = as.factor(1:12),
                      grp = as.factor(c("A", "B", "A", "B", "C", "C",
                                        "C", "A", "D", "E", "F", "D")))
setkey(DT, ind)
setkey(match_dt, ind)
DT = match_dt[DT]

我们也可以这样做(我认为是这样),更可读的方式,像这样(边际速度成本):

级别
match_dt = data.table(ind = as.factor(1:12),
                      grp = as.factor(c("A", "B", "A", "B", "C", "C",
                                        "C", "A", "D", "E", "F", "D")))
setkey(DT, ind)
setkey(match_dt, ind)
DT = match_dt[DT]
levels <- letters[1:12]
levels[c(1, 3, 8)] <- "A"
levels[c(2, 4)] <- "B"
levels[5:7] <- "C"
levels[c(9, 12)] <- "D"
levels[10] <- "E"
levels[11] <- "F"
match_dt <- data.table(ind = as.factor(1:12),
                       grp = as.factor(levels))
setkey(DT, ind)
setkey(match_dt, ind)
DT = match_dt[DT]