2 вектора под петли - PullRequest
       0

2 вектора под петли

0 голосов
/ 17 февраля 2020

У меня есть датафрейм df со столбцом ID. Я пытаюсь сделать все возможное сочетание между другим вектором под названием даты

df

ID
Asda
Dsaa
Fasd
Das

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

Я написал следующее для l oop. Но я получаю только результат ниже

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

Результат ниже

new_value
        ID        Date 
      "Das"     "18258"  

Ожидаемый результат: Могу ли я получить все комбинации идентификаторов и дат?

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Все возможные комбинации идентификатора и даты

expand.grid(df$ID,dates)

Редактировать: использование для циклов

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
    }
}
1 голос
/ 17 февраля 2020

Вы можете использовать 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

Редактировать: Для l oop только

new_df <- data.frame()
for (i in df$ID) {
  for (j in dates) {
    new_df <- rbind(new_df, data.frame(ID = i, Date = j))
  }
}
0 голосов
/ 17 февраля 2020

Это не for l oop, но для полноты (expand.grid и merge - это 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...