r - 如何在 data.table 中的多个列中使用 ifelse?
问题描述
我在 data.table 中有多个列,我想在其上应用 ifelse 语句。我可以为每一列重复代码,但我想知道是否有更优雅的解决方案
对于给定的数据表,我想使用 ifelse 语句更改一些数字列。
这是数据:
dt = data.table(id = c(101, 102, 103, 104), one_cnt = c(0, 6, 4, 0), two_cnt = c(4, 0, 0, 2))
dt
如果我想手动执行此操作,我可以在所有列中执行此操作
dt$one_cnt = ifelse(dt$one_cnt == 0, 0, 2)
相反,我想选择以下列并将 ifelse 应用于每个
colnames(dt)[grepl("cnt", colnames(dt))]
对于 one_cnt 和 two_cnt,0 值将以 0 结束。非零值将采用 1 值
解决方案
我们可以.SDcols
用来指定选定的列。
library(data.table)
cols <- grep("cnt", colnames(dt), value = TRUE)
dt[, (cols) := lapply(.SD, function(x) ifelse(x == 0, 0, 2)), .SDcols = cols]
dt
# id one_cnt two_cnt
#1: 101 0 2
#2: 102 2 0
#3: 103 2 0
#4: 104 0 2
从您的尝试中,您将 0 值替换为 0 并将非零值更改为 2,但在您的描述中您提到要将非零值更改为 1,因此我不清楚您的预期输出。如果你想将其更改为 1,你可以这样做
dt[, (cols) := lapply(.SD, function(x) as.integer(as.logical(x))), .SDcols = cols]
推荐阅读
- javascript - Cordova 中的 URL 添加了感叹号
- android - Lottie 动画编译不工作 - 为什么?
- apache-spark - 写入外部 Hive 表时的 Spark 压缩
- java - Java并发 - 线程未完成循环
- symfony - 没有斜杠的 Twig 命名空间路径在本地计算机(Mac)上有效,但在服务器上无效
- java - List的Hibernate映射
“不是实体” - c# - 在 IASyncResult 中为 Ping 捕获异常
- c++ - 将长数组转换为 const char*
- java - 如何动态地从数据表中检索数据?
- javascript - 如何通过属性的值在 JSON 数组中累积值?