【问题标题】:2 Vectors under for loop2 for 循环下的向量
【发布时间】:2020-02-17 09:20:10
【问题描述】:

我有一个带有 ID 列的数据框 df。我正在尝试在另一个称为日期的向量之间进行所有可能的组合

df

ID
Asda
Dsaa
Fasd
Das

dates <- seq(as.Date("2019-12-27"), as.Date(" "), by=1)

我写了一个下面的 for 循环。但我只得到低于结果

for (i in df$ID) {
  for (j in dates) {
    new_value <- c(i, j)
  }
}

结果如下

new_value
        ID        Date 
      "Das"     "18258"  

预期结果是:我可以获得 ID 和日期的所有组合吗?

【问题讨论】:

标签: r


【解决方案1】:

您可以使用merge 获取变量的所有组合:

df <- data.frame(ID = c("Asda", "Dsaa", "Fasd", "Das"))
dates <- seq(as.Date("2019-12-27"), as.Date("2019-12-28"), by=1)

merge(df, dates, by = NULL)

结果:

    ID          y
1 Asda 2019-12-27
2 Dsaa 2019-12-27
3 Fasd 2019-12-27
4  Das 2019-12-27
5 Asda 2019-12-28
6 Dsaa 2019-12-28
7 Fasd 2019-12-28
8  Das 2019-12-28

编辑:仅用于循环

new_df <- data.frame()
for (i in df$ID) {
  for (j in dates) {
    new_df <- rbind(new_df, data.frame(ID = i, Date = j))
  }
}

【讨论】:

  • 谢谢。但实际上我只需要 for 循环。不可能吗?
【解决方案2】:

ID 和日期的所有可能组合

expand.grid(df$ID,dates)

编辑:使用for循环

k=1
temp=matrix(NA,length(df$ID)*length(dates),2)
for (i in df$ID) {
    for (j in dates){
        temp[k,]=c(i,j)
        k=k+1
    }
}

【讨论】:

  • 谢谢。但实际上我只需要 for 循环。不可能吗?
【解决方案3】:

这不是 for 循环,而是为了完整起见(expand.gridmergeare R base 很好的答案)这里是另一个使用 tidyr::crossing() 的解决方案。我不知道你为什么要在这里这样做,因为它更难优化(参见 Miles Mcbain for-loops 的一篇好文章)。

dfr <- data.frame(id = paste0("id", 1:10), dates = seq.Date(from = as.Date("2019-12-27"), by = 1, length.out = 10 ) )
dfr
#>      id      dates
#> 1   id1 2019-12-27
#> 2   id2 2019-12-28
#> 3   id3 2019-12-29
#> 4   id4 2019-12-30
#> 5   id5 2019-12-31
#> 6   id6 2020-01-01
#> 7   id7 2020-01-02
#> 8   id8 2020-01-03
#> 9   id9 2020-01-04
#> 10 id10 2020-01-05

tidyr::crossing(dfr$id, dfr$dates)
#> # A tibble: 100 x 2
#>    `dfr$id` `dfr$dates`
#>    <fct>    <date>     
#>  1 id1      2019-12-27 
#>  2 id1      2019-12-28 
#>  3 id1      2019-12-29 
#>  4 id1      2019-12-30 
#>  5 id1      2019-12-31 
#>  6 id1      2020-01-01 
#>  7 id1      2020-01-02 
#>  8 id1      2020-01-03 
#>  9 id1      2020-01-04 
#> 10 id1      2020-01-05 
#> # ... with 90 more rows

【讨论】:

    猜你喜欢
    • 2016-11-01
    • 2023-03-25
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多