r - 以内存有效的方式处理没有循环的 R 数据帧行
问题描述
我的 dataframe 的结构data1
有超过 150 万行,如下所示:
data1 <- data.frame(NEW_UPC=c(11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005992,11820005992,11820005992,11820005992,11820005992,11820005992,11820005992,11820005992,11820005992,11820005993,11820005993,11820005993,11820005993,11820005993,11820005993,11820005993,11820005993,11820005993,11820005994,11820005994,11820005994,11820005994,11820005994,11820005994,11820005995,11820005995,11820005995,11820005995,11820005995,11820005995,11820005995,11820005995,11820005995),
IRI_KEY=c(1073521,1073521,1073521,1073525,1073525,1073525,1078106,1078106,1078106,1078107,1078107,1078107,1073521,1073521,1073521,1073525,1073525,1073525,1078106,1078106,1078106,1073521,1073521,1073521,1073525,1073525,1073525,1078106,1078106,1078106,1073521,1073521,1073525,1073525,1078106,1078106,1073521,1073521,1073521,1073525,1073525,1073525,1078106,1078106,1078106),
WEEK = c(1229,1230,1232,1218,1224,1229,1282,1285,1287,1229,1230,1232,1229,1230,1232,1218,1224,1229,1282,1285,1287,1229,1230,1232,1217,1221,1227,1270,1272,1273,1273,1274,1270,1272,1217,1221,1229,1230,1232,1218,1224,1229,1282,1285,1287),
END=c(1232,1232,1232,1229,1229,1229,1287,1287,1287,1232,1232,1232,1232,1232,1232,1229,1229,1229,1287,1287,1287,1232,1232,1232,1227,1227,1227,1273,1273,1273,1274,1274,1272,1272,1221,1221,1232,1232,1232,1229,1229,1229,1287,1287,1287))
我需要Exit.time
使用列中的值WEEK
和END
截止值(即 1287)插入一列。Exit.time
根据以下逻辑,该值应为 0 或 1:
如果WEEK
= 1287,则Exit.time
= 0。
如果Week
不等于 1287,但WEEK
=END
那么Exit.time
= 1,否则Exit.time
= 0。
为此,我尝试了以下 for 循环,它完成了上述虚拟数据集中所需的操作。
i=0
for(i in 1:length(data2$NEW_UPC)){
if (data2$WEEK[i]==1287) {
data2$Exit.time[i] <- 0
} else if(data2$WEEK[i]==data2$END[i]) {
data2$Exit.time[i] <- 1
} else {
data2$Exit.time[i] <- 0
}
}
问题是当我在我的真实数据集中使用上述循环时,即使一个小时后我也没有得到输出。考虑到数据集的大小,我猜循环效率不高。有没有其他方法可以做我想做的事?我更喜欢保持行的顺序,data1
因为我稍后需要做一些合并操作。
解决方案
由于您需要Exit.time
在 1 时为 1 (WEEK == END) & WEEK != 1287
,否则为 0 ,您可以as.numeric
在 的结果上使用(WEEK == END) & WEEK != 1287
,它会TRUE
变为1
和。FALSE
0
data1$Exit.time <- with(data1, as.numeric(WEEK != 1287 & WEEK == END))
推荐阅读
- angular - 以角度处理多组件形式
- vba - Mapping table with multiple items
- laravel - Kubernetes 上的 Laravel - CronJob swift 550 5.7.1 中继被拒绝
- c# - 如何在使用 Polly 重试之前记录一些内容?
- c# - “IConfigurationBuilder”不包含“AddAzureAppConfiguration”的定义
- arduino - 如何使用 IMU 使 x 和 y 旋转独立
- python - 遍历方法列表?
- python - 页面存在但内容为 404 错误(想使用 Selenium 获取图像)
- javascript - 在 API 响应中循环遍历字典
- c# - 从集合的继承中获取价值