r - 根据一个变量的条件重新编码多个变量
问题描述
我想根据另一个变量中的值重新编码多个变量(其中大约 90 个)。
这是一个示例:
df <- data.frame(var1 = c(1,0,5,10,0), var2 = c(1:5), var3 = c(1:5), var4 =
c(1:5), var5 = c(1:5), var6 = c(1:5), var90 = c(1:5))
df
var1 var2 var3 var4 var5 var6 var90
1 1 1 1 1 1 1 1
2 0 2 2 2 2 2 2
3 5 3 3 3 3 3 3
4 10 4 4 4 4 4 4
5 0 5 5 5 5 5 5
当 var1 = 0 时,我想将 var2 重新编码为 var90 为 0,否则保持原样。
我可以使用以下方法轻松地重新编码单个变量:
df[df$var1 == 0, c("var2")] <- 0
我可以使用数字符号将其应用于多列:
df[df$var1 == 0, c(2:7)] <- 0
在这个小样本集上做得很好,这是预期的结果:
var1 var2 var3 var4 var5 var6 var90
1 1 1 1 1 1 1 1
2 0 0 0 0 0 0 0
3 5 3 3 3 3 3 3
4 10 4 4 4 4 4 4
5 0 0 0 0 0 0 0
然而,在我的完整数据集(约 90 个变量,90,000 行)上,我不得不在大约 20 分钟后中止,因为它仍然没有运行(希望让它在几秒钟内而不是几分钟内运行)。
关于如何有效地解决这个问题的任何想法?
解决方案
我们可以使用set
fromdata.table
来加快速度
library(data.table)
setDT(df)
for(j in 2:7) set(df, i = which(df$var1 == 0), j = j, value = 0)
df
# var1 var2 var3 var4 var5 var6 var90
#1: 1 1 1 1 1 1 1
#2: 0 0 0 0 0 0 0
#3: 5 3 3 3 3 3 3
#4: 10 4 4 4 4 4 4
#5: 0 0 0 0 0 0 0
另外,我们可以使用lapply
frombase R
来避免创建一个大的逻辑矩阵
df[2:7] <- lapply(df[2:7], function(x) replace(x, df$var1 == 0, 0))
推荐阅读
- azure - azure 函数应用程序见解中的自定义属性
- python - tkinter 从菜单中显示新框架
- asp.net - 用于缓存 API 响应的简单基于 EF 的表花费的时间太长
- vb.net - Visual Studio 2017 中的 Intellisense 正在从自动完成列表中隐藏成员
- c# - 在 C# 中使用正则表达式替换字符
- php - 如何将波斯/阿拉伯数字从字符串转换为英文数字?
- networking - 请示例 Kubernetes 外部地址与内部地址
- ruby-on-rails - 为什么 :locale 不适用于绝对路径?
- db2 - Oracle SQL Developer 数据库差异未列出我的连接
- python - 程序功能不起作用。它不能传递变量