【发布时间】:2020-01-31 17:08:24
【问题描述】:
我有一个大约 80 万行的数据表对象。其中的某些列具有 Yes/No 值。我想分别改成1/0。这里workable_data 是我的data.table 对象:
我的修改代码(看起来太简单了):
yes_No_to_1 <- function(x){
sapply(x,function(x){
if(x =='Yes'){
1
}else{
0}
})
}
sapply(workable_data[,product,with=FALSE],yes_No_to_1)
但是有两个问题:(1) 需要很长时间;(2) 我想以 data.table 的方式永久更改 workable_data 中的值。
您可以使用以下方法重现示例数据:
product <- c("HasProduct1","HasProduct2","HasProduct3","HasProduct4","HasProduct5","HasProduct6","HasProduct7","HasProduct8","HasProduct9","HasProduct10")
workable_data <- as.data.table(data.frame(x=sample(1:100),sapply(product,function(x){x <-sample(c("Yes","No"),10000,replace = T)})))
我认为有更好的方法来实现这一点,但我似乎无法弄清楚,我也很感激任何关于优化我的功能的建议(这将是最后的手段)。这个样本数据所花费的时间对于 10k 行来说是相当糟糕的。
user system elapsed
6.21 0.00 6.25
【问题讨论】:
-
使用
factor()将列转换为因子,然后as.numeric()得到数字(workable_data[,product,with=F]$HasProduct1 %>% factor() %>% as.numeric) - 1 -
my_cols = grep("^HasProduct", names(DT), value=TRUE); DT[, (my_cols) := lapply(.SD, function(x) +(x=="Yes")), .SDcols=my_cols]是一种方式。我建议从包的教程材料开始,以了解它的用途及其常用语法:github.com/Rdatatable/data.table/wiki/Getting-started -
我刚刚开始使用 data.table 。我正在浏览这些示例并且可以做一些基本的事情,但你所做的事情远远超出了我的理解。谢谢。让我测试并理解
-
@Frank 我不太明白匿名函数中“+”的使用。请您解释一下
-
嘿,不,
+只是我们最近在 SO 上使用的一个 hack,因为人们通常要求将他们的假人编码为 1/0 而不是 TRUE/FALSE。这就像“代码高尔夫”(笔画/字符越少越好)
标签: r data.table