【问题标题】:Including for loop in subsets在子集中包含 for 循环
【发布时间】:2018-08-15 12:39:29
【问题描述】:

我想计算两艘装有集装箱的船的每周平均装载量。一艘船在周日航行,另一艘船在周三航行。我有一个包含预订的大 Excel 文件。我将在以下链接中加载该文件的一小部分:https://docs.google.com/spreadsheets/d/1BxHTClTkrQzIzZzG5vXXnvKtV0_az83PGJ2ghBaAQr0/edit?usp=sharing

第一艘船获得了应在星期一(Mo)、星期二(Di)和星期三(Mi)交付的集装箱。第二艘船应在周四(Do)、周五(Fr)、周六(Sa)和周日(So)交付对方港口所需的集装箱。数据包含从 2017-01-01 到 2018-07-31 的容器信息。这些是整整 82 周。我想制作一个长度为 82 的向量,每个数字都是该周天数的容器数量。例如,向量的第一个数字应该是第一周的周一、周二和周三的集装箱需求。所以,我想创建一个向量,每艘船一个,其中包含有关应该在这艘船上装载的集装箱数量的信息。一个 82 周的向量,查看我们的需求低的周和平均值等。

谁能帮帮我?

Here is the beginning of my code:

 containers <- "https://docs.google.com/spreadsheets/d/1BxHTClTkrQzIzZzG5vXXnvKtV0_az83PGJ2ghBaAQr0/edit?usp=sharing"

#Containers between Rotterdam and Duisburg
containersRTMDUI <- subset(containers, containers$Laadhaven == "Rotterdam" & containers$Loshaven == "Duisburg")

#I used to do this in subsets, because I could not make a loop
Week1 <- subset(containersRTMDUI, containersRTMDUI$Datum1 >= "2017-01-02" & 
containersRTMDUI$Datum1 < "2017-01-09" & containersRTMDUI$Dag1 = "Mo" & 
containersRTMDUI$Dag1 = "Di" &containersRTMDUI$Dag1 = "Mi")
Week2 <- subset(etc..)

当然,难点在于有几天没有需求。

【问题讨论】:

  • 欢迎来到 SO。请提供一个最小、完整和可验证的示例。向我们展示您最近尝试的代码以及您遇到的问题。并解释为什么结果不是你所期望的。 stackoverflow.com/help/mcve
  • 好的。请给我一点时间
  • 这是R 编程语言吗?如果是这样,我会为此添加一个标签...
  • 完成。感谢您的反馈。

标签: algorithm date rstudio subset logistics


【解决方案1】:

我想我明白了。一种使用 data.table 的方法:

# read in data as a data.table
    library(data.table)
    dt <- data.table(read.csv("path/to/file", stringsAsFactors = F))

# rename variables to english (
# there are shorter ways to do this, but I like to keep track)
    setnames(dt, old = "ISO",          new = "containter_type")
    setnames(dt, old = "F.E",          new = "full_empty")
    setnames(dt, old = "Gewicht",      new = "weight")
    setnames(dt, old = "Laadhaven",    new = "pickup_port")
    setnames(dt, old = "Laadterminal", new = "pickup_terminal")
    setnames(dt, old = "Loshaven",     new = "dropoff_port")
    setnames(dt, old = "Losterminal",  new = "dropoff_terminal")
    setnames(dt, old = "Datum1",       new = "pickup_date")
    setnames(dt, old = "Dag1",         new = "pickup_dow")
    setnames(dt, old = "Datum2",       new = "dropoff_date")
    setnames(dt, old = "Dag2",         new = "dropoff_dow")

# convert date variable to date-type (instead of factor/string)
    dt[ , pickup_date  := as.Date(pickup_date,  "%d.%m.%Y")]
    dt[ , dropoff_date := as.Date(dropoff_date, "%d.%m.%Y")]

# create a week variable
    dt[ , week := lubridate::week(pickup_date)]

# create a variable (MTW) by day-of-week
# MTW=1 for mon, tues, wed; MTW=0 for thurs, fri, sat, sun
    dt[ , MTW := pickup_dow %in% c("Mo", "Di", "Mi")]

# count the number of rows by week and MTW
    result <- dt[ , .(nrows = .N), by=.(week, MTW)]

# print result
    result

# fill in 0 weeks
    dt2 <- data.table(week = rep(1:7, each=2), MTW = rep(c(T,F), each=7))
    result <- merge(result, dt2, by=c("week", "MTW"), all=T)
    result[is.na(nrows), nrows := 0]

# print updated result
    result

【讨论】:

  • 感谢您的反应,但这并不是我想要的。数据集中的每一行代表一次集装箱旅行。因此,ISO 是容器类型,F/E 表示容器是满的还是空的。 Gewicht 是重量,Laadhaven 是指提货的港口,而 Datum1 是可以提货的日期。 Loshaven 是它应该被丢弃的端口。这艘船每周两次从鹿特丹到杜伊斯堡往返两次。他每周三和周日都在鹿特丹。
  • 所以我想提出两个向量,长度均为 83,在 2017-01-01 2018-07-31 期间的周数。一个行程在周日、周一和周二装满集装箱,另一个在其他四天装满。是按 myvalues,我想要数据框的行数,而不是 Gewicht 的平均值。
  • 嘿@BobD.,我对我提供的代码进行了广泛的编辑。看一下,让我知道这个新代码是否可以完成这项工作。请注意,我只使用Dat1 来确定“Sun, Mon, Tues”部分。
  • 非常感谢您的编辑。我会再试一次。
猜你喜欢
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2020-02-03
  • 2021-04-08
  • 1970-01-01
  • 2011-12-07
相关资源
最近更新 更多