r - R:使用“for”循环和“case_when”检查多个变量。
问题描述
我有一个数据集DT如下:
类别:数字1-9
xxx,yyy,zzz:二进制(0,1)
category xxx yyy zzz
8 1 0 0
1 0 0 0
4 0 1 1
9 0 0 1
8 0 1 0
我想使用“for”循环和“case_when”检查多个条件。
所以,我希望数据显示在最后
category xxx yyy zzz result_xxx result_yyy result_zzz
8 1 0 0 8 0 0
1 0 0 0 0 0 0
4 0 1 1 0 4 4
9 0 0 1 0 0 9
8 0 1 0 0 8 0
为此,我在下面编写了代码:
condition.vars <- c("xxx", "yyy", "zzz")
for(i in condition.vars){
browser()
DT <- DT[, condition:= case_when(
([[i]] == 1 & category ==1) ~ 1,
([[i]] == 1 & category ==2) ~ 2,
([[i]] == 1 & category ==3) ~ 3,
([[i]] == 1 & category ==4) ~ 4,
([[i]] == 1 & category ==5) ~ 5,
([[i]] == 1 & category ==6) ~ 6,
([[i]] == 1 & category ==7) ~ 7,
([[i]] == 1 & category ==8) ~ 8,
([[i]] == 1 & category ==9) ~ 9,
TRUE ~ 0
)]
setnames(DT, "condition", paste0("result", i))
}
如您所料,它不起作用。
你能帮我更正我的代码吗?
解决方案
您不需要for
循环或case_when
. 如果您有数据框,则可以将其简化为:
condition.vars <- c("xxx", "yyy", "zzz")
DT[paste0('result_', condition.vars)] <- DT$category * DT[condition.vars]
# category xxx yyy zzz result_xxx result_yyy result_zzz
#1 8 1 0 0 8 0 0
#2 1 0 0 0 0 0 0
#3 4 0 1 1 0 4 4
#4 9 0 0 1 0 0 9
#5 8 0 1 0 0 8 0
如果DT
是data.table
你可以这样做:
library(data.table)
DT[, paste0('result_', condition.vars):= category * .SD,.SDcols = condition.vars]
推荐阅读
- python - 访问元组内的数据
- python - 线程无限期挂起
- python-3.x - boxplot - python - 标签的文本 - 如何更改字体大小
- git - 赫斯基的 Git 推送错误
- c# - 在 C# 中,有没有办法将 Microsoft.VisualBasic.Interaction.MsgBox() 之类的引用调用缩短为 myMsgBox() 之类的调用?
- wordpress - 在wordpress divi主题中将图像对齐在一行中
- sql - Postgres9.6 - 包含引用已创建元素的元素数组的列
- android - Appbarlayout 和滚动标志隐藏一个孩子
- google-apps-script - 将函数输出添加到 sidbar
- javascript - 改变离子清新剂的位置