【问题标题】:Looping through select rows based on input of one or more columns根据一列或多列的输入循环选择行
【发布时间】:2019-09-17 20:51:23
【问题描述】:

我有一个嵌套的项目列表,因此我将 3 个单独的列表组合为一个。我想对所有列表中存在的特定列进行更改。我在下面有更多详细信息

X

  $`Manufacturing`
    Stage           Days.Added  Start.Date  End.Date
    Planning                 2  1968-12-01  NA
    Building                14          NA  NA
    Testing                  3          NA  NA
    Implementation          15          NA  NA

  $`Project Analysis`
    Stage             Days.Added  Start.Date  End.Date
    Initial Review             3  1968-12-01  NA
    Building                  14          NA  NA
    User Testing              20          NA  NA
    Implementation            15          NA  NA
    User Review                7          NA  NA
    Final Analysis             4          NA  NA

lapply(X, '[', 'End.Date') 给我:

  $`Manufacturing`
    End.Date
    NA
    NA
    NA
    NA


  $`Project Analysis`
    End.Date
    NA
    NA
    NA
    NA
    NA
    NA

我想创建一个循环,其中“End.Date”列是第一行的“Start.Date”和“Days.Added”列的添加。结果值将是第二行的“Start.Date”条目,该条目将添加“Days.Added”列以生成第二行的新“End.Date”,依此类推。所以基本上是这样的:

  $`Manufacturing`
    Stage           Days.Added  Start.Date  End.Date
    Planning                 2  1968-12-01  1968-12-03
    Building                14  1968-12-03  1968-12-17
    Testing                  3  1968-12-17  1968-12-20
    Implementation          15  1968-12-20  1969-01-04

  $`Project Analysis`
    Stage             Days.Added  Start.Date  End.Date
    Initial Review             3  1968-12-01  1968-12-04
    Building                  15  1968-12-04  1968-12-19
    User Testing              20  1968-12-19  1969-01-08
    Implementation            15  1969-01-08  1969-01-23
    User Review                7  1969-01-23  1969-01-30
    Final Analysis             4  1969-01-30  1969-02-03

我如何实现这一目标?

【问题讨论】:

  • 我觉得你需要lapply(X, transform, End_Date = Start.Date[1] + Days.Added)
  • 如果你需要这两列lapply(X, transform, Start_Date = Start_Date[1] + Days_Added, End_Date = Start.Date[1] + Days.Added)

标签: r


【解决方案1】:

假设Start.Date' isDate`类,

lapply(X, transform, Start.Date = Start.Date[1] +
    c(0, cumsum(Days.Added[-length(Days.Added)])), 
         End.Date = Start.Date[1] + cumsum(Days.Added))

数据

X <- list(Manufacturing = structure(list(Stage = c("Planning", "Building", 
"Testing", "Implementation"), Days.Added = c(2L, 14L, 3L, 15L
), Start.Date = structure(c(-396, NA, NA, NA), class = "Date"), 
    End.Date = c(NA, NA, NA, NA)), row.names = c(NA, -4L), class = "data.frame"), 
    `Project Analysis` = structure(list(Stage = c("Initial Review", 
    "Building", "User Testing", "Implementation", "User Review", 
    "Final Analysis"), Days.Added = c(3L, 14L, 20L, 15L, 7L, 
    4L), Start.Date = structure(c(-396, NA, NA, NA, NA, NA), class = "Date"), 
        End.Date = c(NA, NA, NA, NA, NA, NA)), row.names = c(NA, 
    -6L), class = "data.frame"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多