R: нет применимого метода для «отдельного_», примененного к объекту класса «персонаж» - PullRequest
1 голос
/ 20 октября 2019

В моей среде четыре фрейма данных, каждый с первым столбцом, который выглядит следующим образом:

      product.consom.unit.tax.currency.geo.time
1                 6000,4161901,KWH,I_TAX,EUR,AL
2                 6000,4161901,KWH,I_TAX,EUR,AT
3                 6000,4161901,KWH,I_TAX,EUR,BA
4                 6000,4161901,KWH,I_TAX,EUR,BE
5                 6000,4161901,KWH,I_TAX,EUR,BG
6                 6000,4161901,KWH,I_TAX,EUR,CY

Я хочу разделить первый столбец на несколько столбцов, используя тидир separate:

data <- list(c("df1", "df2", "df3", "df4"))
sep <- function(x){
  x <- separate(x, 1, c("prod", "band", "unit", "tax", "currency", "geo"), ",", remove = TRUE)
}
lapply(data, sep)

Когда я запускаю lapply, я получаю следующую ошибку:

Ошибка в UseMethod ("Отдельный_"): нет применимого метода для "отдельного_", примененного к объекту класса "персонаж "

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Комментарии под вашим постом указали на проблему. Я предоставляю решение, объединяющее lapply() и list2env() для достижения того, что вы хотите:

library(tidyr)
data <- list(df1, df2, df3, df4)
names(data) <- paste0("df", 1:4)
list2env(lapply(data, separate, 1, c("prod", "band", "unit", "tax", "currency", "geo"), ","), .GlobalEnv)

(по умолчанию аргумент remove в separate() равен TRUE, поэтому я его игнорирую.)

df1 - df4 в рабочей области будут перезаписаны в отдельные формы.

1 голос
/ 20 октября 2019

Ваш код фактически работает один раз на моей машине, как только я изменил data <- list(c("df1", "df2", "df3", "df4")) на data <- list(df1, df2, df3, df4), как предложили @gersht и @NelsonGon. Вам также необходимо удалить c().

Я также попробовал for loop подход:


df1 <- data.frame(product.consom.unit.tax.currency.geo.time = c( 
            "6000,4161901,KWH,I_TAX,EUR,AL",
           "6000,4161901,KWH,I_TAX,EUR,AT",
             "6000,4161901,KWH,I_TAX,EUR,BA",
             "6000,4161901,KWH,I_TAX,EUR,BE",
             "6000,4161901,KWH,I_TAX,EUR,BG",
             "6000,4161901,KWH,I_TAX,EUR,CY"))
df2 <- df3 <- df4 <- df1
data <- list(df1, df2, df3, df4)

library(tidyr)
for (i in 1:4) {
  assign(paste0("df", i), separate(data.frame(data[i]), 1, c("prod", "band", "unit", "tax", "currency", "geo"), ",", remove = TRUE)) 
}              
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...