我正在尝试将因子水平结合起来data.table并想知道是否存在data.table这样做的方法.
例:
DT = data.table(id = 1:20, ind = as.factor(sample(8, 20, replace = TRUE)))
Run Code Online (Sandbox Code Playgroud)
我想说类型1,3,8属于A组; 2和4属于B组; 和5,6,7在C组.
这就是我一直在做的事情,这个问题的完整版本速度很慢:
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")]
Run Code Online (Sandbox Code Playgroud)
这个相关问题提出的另一种方法,我猜这样翻译:
DT[ , grp := ind]
levels(DT$grp) = c("A", "B", "A", "B", "C", "C", "C", "A")
Run Code Online (Sandbox Code Playgroud)
或许(考虑到我有65个基础组和18个聚合组,这感觉有点整洁)
DT[ , grp := ind]
lev <- letters(1:8)
lev[c(1, 3, 8)] <- "A"
lev[c(2, 4)] <- "B" …Run Code Online (Sandbox Code Playgroud) ifelse() 函数允许通过一系列测试过滤向量中的值,每个测试都会产生不同的操作.例如,xx设为data.frame,如下所示:
xx <- data.frame(a=c(1,2,1,3), b=1:4)
xx
Run Code Online (Sandbox Code Playgroud)
ab
1 1
2 2
1 3
3 4
假设您要从列b创建新列c,但是根据以下方式列a中的值:
对于每一行,
使用ifelse(),解决方案可能是:
xx$c <- ifelse(xx$a==1, xx$b,
ifelse(xx$a==2, xx$b*100,
-xx$b))
xx
Run Code Online (Sandbox Code Playgroud)
abc
1 1
2 2 2 200
1 3 3
3 4 -4
当测试数量增加时,例如四个测试会出现美学问题:
xx$c <- ifelse(xx$a==1, xx$b,
ifelse(xx$a==2, xx$b*100,
ifelse(xx$a==3, ..., …Run Code Online (Sandbox Code Playgroud) OECD 数据中的 STRATUM 太长,为了简单起见,我使用了这个名称,并希望将其简化为更短和更精确的命名,如下面的代码所示。
pisaMas[,`:=`
(SchoolType = c(ifelse(STRATUM == "National Secondary School", "Public",
ifelse(STRATUM == "Religious School", "Religious",
ifelse(STRATUM == "MOE Technical School", "Technical",0)))))]
pisaMas[,table(SchoolType)]
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一个简单的方法来解决这个问题,使用 data.table 包。