【问题标题】:Vectorised solution to for loopfor 循环的矢量化解决方案
【发布时间】:2017-06-04 08:01:34
【问题描述】:

下面的 for 循环是否有矢量化解决方案。这是一个包含医疗机构入院数据的大型数据集。

已编辑

library(lubridate)

dateSeq  <- as.Date(c("2015-01-01", "2015-02-01"))

admissionDate  <- as.Date(c("2015-01-03", "2015-01-06", "2015-01-10", "2015-01-05", "2015-01-07", "2015-02-03", "2015-02-06"))
Dfactor  <- c("elective", "acute", "elective", "acute", "acute", "elective", "acute")
Dfactor  <- factor(Dfactor)
df  <- data.frame(admissionDate, Dfactor)
# loop through large dataset collecting tabulated data from a factorised vector for each month (admissions date) based on 'dateSeq'


Dfactorsums  <- c()

for (i in 1:length(dateSeq)) {
    monthSub  <- df[(df$admissionDate >= as.Date(timeFirstDayInMonth(dateSeq[i]))) & (df$admissionDate <= as.Date(timeLastDayInMonth(dateSeq[i]))), ]
    x  <- table(monthSub$Dfactor)
    Dfactorsums[i]  <- as.numeric((x[1]))
}

print(Dfactorsums)   
# Outcome = [1] 3 1
# Question is rather than use a for loop is there a 'vectorized' solution.

【问题讨论】:

  • 请展示一个可重现的小示例和基于该示例的预期输出。 df 是什么?
  • 您似乎希望每月统计第二个值 Dfactor 的出现次数。对吗?
  • 对。确切地。稍后将提供更详尽的示例。

标签: r


【解决方案1】:

这在技术上不是“矢量化”的,但应该做你所追求的,而且应该很快。

library( data.table )
setDT( df )

df[ , month := format( AdmissionsDate, "%m" ) ]
df[ , table( Dfactor )[2], by = month ]

我们将一列设置为月份,以便更轻松地按月份进行子集,然后提取每个月所需的值。这应该输出一个两列数据表,第二列等于您的Dfactor 输出向量。

【讨论】:

  • 对不起,不能像新手一样投票,但谢谢你这个作品,正如你所说的那样快得多。一直在尝试探索是否可以使用 apply 类型的命令。用这个管理了一些简单的列等,但这个让我很困惑。也必须更多地探索 data.table。似乎非常有用。再次感谢。
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多