gpt4 book ai didi

R - 基于前一行和其他列的新因子变量。优化 Ielse

转载 作者:行者123 更新时间:2023-12-02 06:27:54 25 4
gpt4 key购买 nike

我一直在搜索周围的 SO 和其他数据科学和编程博客,但我没有找到满足我特定需求的答案。所以,如果您发现这个问题重复,请告诉我信息来源并关闭/删除这个问题。

我的真实数据将有几千行,所以我在这里只显示一小部分虚构的数据,它们与我的原始数据非常相似:

Data <- data.frame(
ID = c(1,1,1,1,2,2,2,2,3,3),
Year = c(2014,2015,2016,2017,2007,2008,2009,2010,2016,2017),
CmSm = c(1,2,1,0,1,0,0,1,1,0),
Index = c(1,2,3,4,1,2,3,4,1,2)
)

我最终想要得到的数据集是:

Dataout <- data.frame(
ID = c(1,1,1,1,2,2,2,2,3,3),
Year = c(2014,2015,2016,2017,2007,2008, 2009,2010,2016,2017),
CmSm = c(1,2,1,0,1,0,0,1,1,0),
Index = c(1,2,3,4,1,2,3,4,1,2),
Cassification = c("New", "Existing", "Existing", "Lost", "New", "Lost","","Returning", "New","Lost")
)

到目前为止我最好的尝试如下:

Dataout$Status <- ave( Dataout$CmSm, 
Dataout$ID,
FUN = function(x) ifelse( Dataout$Index == 1, "New", ifelse( x[-1] == 0 & x > 0, "Returning", ifelse( x[-1] == 0 & x == 0, "", ifelse( x[-1] > 0 & x == 0, "Lost", "Existing" ) ) ) ) )

但是这种尝试有两个问题:

  1. 分类错误;

  2. 当我在我的原始数据中使用此代码时,有成千上万行,R 进行了 15 分钟的计算并且不检索任何结果(我想 ifelse 没有帮助......),不是更何况分配给进程的内存高得离谱。

手头问题的解释,分类规则:

给定项目 ID、年份和项目 ID 索引的列表,我想将这些项目分类为以下类别:"new"、“现有”、“返回”、“丢失”和“”或 null 或 NA。分类规则如下(CmSm-1表示相对于现在CmSm值的近期前期值):

如果索引 == 1 则“新建”。

如果 Index > 1 那么:

如果 CmSm-1 == 0 且 CmSm > 0,则“返回”。

如果 CmSm-1 == 0 且 CmSm == 0 则 ""-> 这类似于对象没有注册事件的情况。

如果 CmSm-1 > 0 且 CmSm > 0,则“存在”。

如果 CmSm-1 > 0 且 CmSm == 0 则“丢失”。

如果您觉得我的规则解释令人困惑,请告诉我,这样我就有机会为您澄清。

提前感谢您提供的任何帮助。干杯!

最佳答案

为什么不只使用单个矢量化条件步骤?

library(dplyr)

Data$Classification <- NA
Data$Classification[Data$Index == 1] <- "New"
Data$Classification[Data$Index > 1 & lag(Data$CmSm) == 0 & Data$CmSm > 0] <- "Returning"
Data$Classification[Data$Index > 1 & lag(Data$CmSm) == 0 & Data$CmSm == 0] <- ""
Data$Classification[Data$Index > 1 & lag(Data$CmSm) > 0 & Data$CmSm > 0] <- "Existing"
Data$Classification[Data$Index > 1 & lag(Data$CmSm) > 0 & Data$CmSm == 0] <- "Lost"

> Data
ID Year CmSm Index Classification
1 1 2014 1 1 New
2 1 2015 2 2 Existing
3 1 2016 1 3 Existing
4 1 2017 0 4 Lost
5 2 2007 1 1 New
6 2 2008 0 2 Lost
7 2 2009 0 3
8 2 2010 1 4 Returning
9 3 2016 1 1 New
10 3 2017 0 2 Lost

这有快如 hell 的好处。

这个与 case_when 的微基准测试:

Unit: milliseconds
expr min lq mean median uq max neval cld
LAP 1.173902 1.208178 1.580413 1.253404 1.313137 17.07946 100 a
h3rm4n 5.538701 5.732692 7.310704 5.913030 6.138168 50.67234 100 b

关于R - 基于前一行和其他列的新因子变量。优化 Ielse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51170025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com