L oop с левым соединением дает мне ошибку "UseMethod (" left_join ") error: Нет Применимый метод для 'left_join', примененный к объекту класса" list "" - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь создать al oop, который объединяет 5 таких фреймов данных

c <- list(EC_Pop, EC_GDP, EC_Inflation, ST_Tech_Exp, ST_Res_Jour)

for (i in seq_along(c))
{
  if (i < 2)
  {
    EC_New <- c[i] %>%
      left_join(c[i+1], by = c("Country","Year"))
  }
  else if(i > 1 & i < 4) 
  {
    EC_New <- EC_New %>%
      left_join(c[i+1], by = c("Country","Year"))
  }
  else
  {
    EC_New
  }
}

Но у меня есть ошибка: UseMethod ("left_join") error: No Applicable method for 'left_join' applied to object of class "list"

Может кто-нибудь объяснить причину? Мне кажется очень логичным то, как я это написал ...

1 Ответ

1 голос
/ 10 июля 2020

Согласно документации left_join, оба x и y должны быть фреймами данных .

Ваш c - это список, как и c[i].

Однако c[[i]] - это фрейм данных. Поэтому измените свой код, включив в него две квадратные скобки.

EC_New <- c[[i]] %>%
      left_join(c[[i+1]], by = c("Country","Year"))

Я думаю, вы также можете заменить свой код, используя Reduce:

EC_New2 <- Reduce(left_join, c)

Затем проверьте:

identical(EC_New, EC_New2) # should be TRUE

Но я не уверен, так как у меня нет вашего данные. Он должен работать, если общие столбцы: только «Страна» и «Год».

И благодаря этому ответу, вы можете использовать следующую команду, если " Страна »и« Год »- это не единственные общие столбцы.

EC_New2 <- Reduce(function(x, y) left_join(x, y, by=c("Country","Year")), c)

Кстати, старайтесь не использовать имена функций, такие как c, для именования ваших объектов R. Хотя R позволяет это, позже это может привести к путанице. Например, если вы хотите объединить x и y, но случайно наберете c[x, y] вместо c(x, y), R может вернуть не ошибку, а нечто совершенно неожиданное.

...