【问题标题】:How to create a loop for adding new columns in a df - R如何创建循环以在 df - R 中添加新列
【发布时间】:2019-07-10 16:12:43
【问题描述】:

我需要你的帮助。我有一个包含日期和值的数据框,如下所示:

Id        Date1      Date2        Value
1       01/01/18    01/03/18     1.000
2       01/05/18    01/07/18     500
3       01/03/18    01/06/18     17.000
4       01/12/18    01/01/19     670
5       01/10/18    01/12/18     9.600

我需要创建一个 for 循环,以便将新列添加到 i = (0, 60, 90, 180, 270, 360) 的数据帧中,所以 -> 如果 RifDate(是一个常数日期) - Date1 > i & RifDate - Date2

因此,我希望获得六个新列,其中包含 0 或行中的值

【问题讨论】:

  • 您可以使用df[paste0("newcol", i1)] <- sapply(i1, function(i) with(df, as.integer((RifDate - Date1) > i & (RifDate - Date2) < i))))。在此之前将“日期”列转换为 Date
  • @xxx 你的意思是“如果 RifDate(是一个恒定的日期) - Date1 > i & RifDate - Date2”,这不是很清楚你在追求什么。

标签: r


【解决方案1】:

根据您的“RifDate”,您可能会得到不同的结果:

df <- as.data.frame(
  read.table(text = 
"Id         Date1       Date2     Value
 1       01/01/18    01/03/18     1.000
 2       01/05/18    01/07/18     500
 3       01/03/18    01/06/18     17.000
 4       01/12/18    01/01/19     670
 5       01/10/18    01/12/18     9.600",header=TRUE)
) %>%mutate_at(2:3, function(x) as.Date(as.character(x), "%m/%d/%y"))

RefDate <- as.Date("01/04/18", "%m/%d/%y")
ref <- c(0, 60, 90, 180, 270, 360)
dat <- NULL

for (i in 1:length(ref)) {
  for (j in 1:nrow(df)) {
    if ((RefDate - df$Date1[j] > ref[i]) & (RefDate - df$Date1[j] > RefDate - df$Date2[j])) {
      dat[j] <- df$Value[j]
    } else
      dat[j] <- 0
  }
  df[,paste0("X", i)] <- dat
}

df
  Id      Date1      Date2 Value X1 X2 X3 X4 X5 X6
1  1 2018-01-01 2018-01-03   1.0  1  0  0  0  0  0
2  2 2018-01-05 2018-01-07 500.0  0  0  0  0  0  0
3  3 2018-01-03 2018-01-06  17.0 17  0  0  0  0  0
4  4 2018-01-12 2019-01-01 670.0  0  0  0  0  0  0
5  5 2018-01-10 2018-01-12   9.6  0  0  0  0  0  0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2020-10-09
    • 2019-08-13
    • 2021-05-20
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多