根据 R 中的条件操作向量

Posted

技术标签:

【中文标题】根据 R 中的条件操作向量【英文标题】:Manipulating a vector based on a condition in R 【发布时间】:2018-01-04 06:46:30 【问题描述】:

我正在尝试找到一种有效的方法来执行以下代码 sn-p 但在相当大的数据帧(2M+ 记录)上。我试过使用sapplyfor loop,但都不是很好。

“ACCOUNT_CLOSE_DATE”恰好为空白,但它是给定“U_ID”的最后一个“AS_OF_DATE”。我想将此特定值插入到“U_ID”的“ACCOUNT_CLOSE_DATE”列中。任何帮助将不胜感激!

 library(reshape2)
 cnames = c("Date", "999:999", "888:888", "777:777")
 dates = c("31JAN2005", "28FEB2005", "31MAR2005")
 val = ""
 mydf = data.frame(cbind(dates, matrix(val, nrow = 3, ncol = 3)))
 colnames(mydf) = cnames
 nmydf = melt(mydf, id.vars = "Date")
 nmydf$Date = as.character(nmydf$Date)
 colnames(nmydf) = c("AS_OF_DATE", "U_ID", "ACCOUNT_CLOSE_DATE")
 uvals = c("999:999", "888:888", "777:777")
 nmydf[nmydf$U_ID == uvals[1],"ACCOUNT_CLOSE_DATE"] = 
   nmydf[nmydf$U_ID == uvals[1], "AS_OF_DATE"][length(nmydf[nmydf$U_ID == uvals[1], "AS_OF_DATE"])]

【问题讨论】:

为什么是 C++ 标签? @RSahu 这是一个建议的标签。我在这里发的不多,所以只是假设它是正确的。如果您有 C++ 解决方案,我会很感兴趣。 不合适。删除它会更好,IMO。 您是否尝试过将您的 R 代码重写为 data.table 样式? data.table 包承诺性能增强 @Patrik_P 你能用 data.table 做一个例子吗? 【参考方案1】:

您可以进行 data.table 连接,以便将每组“U_ID”的截止日期获取到表中,如下所示:

library(data.table)
cnames <-  c("Date", "999:999", "888:888", "777:777")
dates <-  c("31JAN2005", "28FEB2005", "31MAR2005")
val <-  ""
mydt <-  data.table(cbind(dates, matrix(val, nrow = 3, ncol = 3)))
setnames(mydt, cnames)
nmydt <-  melt(mydt, id.vars = "Date")[,Date:variable]
setnames(nmydt, c("AS_OF_DATE", "U_ID"))
closing_dates <- setnames(nmydt[, .SD[.N], by=U_ID], c("U_ID", "ACCOUNT_CLOSE_DATE"))
merge(nmydt, closing_dates, by="U_ID", all.x=TRUE)

#       U_ID AS_OF_DATE ACCOUNT_CLOSE_DATE
# 1: 999:999  31JAN2005          31MAR2005
# 2: 999:999  28FEB2005          31MAR2005
# 3: 999:999  31MAR2005          31MAR2005
# 4: 888:888  31JAN2005          31MAR2005
# 5: 888:888  28FEB2005          31MAR2005
# 6: 888:888  31MAR2005          31MAR2005
# 7: 777:777  31JAN2005          31MAR2005
# 8: 777:777  28FEB2005          31MAR2005
# 9: 777:777  31MAR2005          31MAR2005

此解决方案还应该提供效率提升。

【讨论】:

以上是关于根据 R 中的条件操作向量的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 R 中的用户定义层次结构找到向量的最大字符?

根据向量中的 *not* 选择 R 数据框中的列

根据 R 中的特定列名从字符向量中删除逗号

根据R中的向量变化来改变行数

根据存储在 data.frame 中的单独字符向量,有条件地重命名列表中的列

Groupby 一列并根据 R 中的字符串向量重新排列另一列字符串