【发布时间】:2020-01-08 23:24:10
【问题描述】:
一个大的ish data.table,有 750k 行和近 200 列,但这会做:
dt <- data.table(id = 1:15,
outcome = factor(c(0, 0, 0, 1, 1, 3, 3, 3, 3, 3, 0, 3, 1, 1, 3),
labels = c("F0","F1","F3")),
var1 = c(0, 0, 0, 1, 1, 2, 2, 2, NA, NA, 0, 0, 0, 0, 0),
var2 = c(0, 0, NA, NA, NA, 0, 0, 0, 0, 0, 6, 6, 4, 4, 4))
我想通过结果变量中的条件更改/分组变量 var1、var2 (和任何其他变量)的“标签”。一张表格直观地解释了我想要更改的内容
xtabs(~var1+outcome, dt, addNA = TRUE)
xtabs(~var2+outcome, dt, addNA = TRUE)
当未出现结果==F1 时,应将 var1、var2 和任何其他变量的标签分组。从第 1 个表开始:更改 2;来自第二张表,第 0 组和第 6 组。
如果级别和变量的数量很少,我可以用一个衬里手动完成:
dt$var1[dt$var1==2] <- "nF" #data frame way
dt[, var1 := as.character(var1)][var1 == "2", var1 := "nF"] #data.table way
xtabs(~var1+outcome, dt, addNA = TRUE) #check
outcome
var1 F0 F1 F3
0 4 2 2
1 0 2 0
nF 0 0 3
<NA> 0 0 2
这两个一个内衬都可以工作,但正如您想象的那样,有 200 列和一些超过一千个级别的变量,这是不可能的。
于是我想出了一个主意:
- 为每个变量建立一个与结果相关的表格
- 获取结果==F1 出现 0 次的标签
- 使用 ifelse 语句更改变量
第一步
#rebuild dt to try this
(temp1 <- dcast(data = dt,
formula = var2 ~ outcome,
value.var = "outcome",
fun.aggregate = length))
第 2 步
tempvar <- temp1[F1==0 & var2!="NA", var2]
第 3 步
dt[, var2 := ifelse(var2 %in% tempvar, "nF", var2)]
xtabs(~var2+outcome, dt, addNA = TRUE) #check
outcome
var2 F0 F1 F3
4 0 2 1
nF 3 0 6
<NA> 1 2 0
这也行得通,而且我不必浏览所有这些标签。所以我把它做成了一个 for 循环......用一个非常酷的计数器 =p
# Initialize
tabs <- c()
temp <- c()
counter <- 0
for (i in colnames(dt[, c("var1", "var2")])) {
# counter & progress
counter <- counter + 1
cat("Variable: ", counter, "of", ncol(dt), " ", i, "\n")
# build tables for each variable with dcast
tabs[[i]] <- dcast(data = dt,
formula = dt[[i]] ~ outcome,
value.var = "outcome",
fun.aggregate = length)
# temp: labels to group & set name
temp[[i]] <- data.table(tabs[[i]][F1==0 & dt!="NA", dt],
"nF")
colnames(temp[[i]])[1] <- i
}
# Names of the 1st column for each tabs (for some reason, I couldn't do it inside the loop)
for(i in 1:length(tabs)) {colnames(tabs[[i]])[1] <- names(tabs[i])}
这工作正常......到目前为止。现在让我们看看 temps 和 tabs:
#temp has the labels to be changed for each variable
temp
#tabs has the tables for each variable with respect to the outcome
tabs
就是这样。我被困住了,我已经在这两天了,几乎所有的 Stackoverflow 链接都是紫色的。现在我不知道该怎么做。
- 我做得过火了吗? - 有没有更好的方法?
- 有什么可以帮我的吗?由于速度,我更喜欢 data.table,但在这一点上,我不会抱怨。
谢谢, 阿尔多
【问题讨论】:
-
酷计数器。但是,您能粘贴预期的输出应该是什么样子吗?
-
@NelsonGon 编辑以显示预期结果
-
为什么不先融化再进行操作?
-
@chinsoon12,是的!发布后,我与融化非常接近。我想睡个好觉会创造奇迹;但它仍然不能 100% 工作。亚历克西斯的答案有效,但我仍在学习为什么会这样......
标签: r data.table reshape melt