【问题标题】:No applicable method for 'separate_' applied to an object of class "character"没有适用于“单独_”的方法应用于“字符”类的对象
【发布时间】:2019-10-20 08:09:22
【问题描述】:

我的环境中有四个数据框,每个数据框的第一列如下所示:

      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

我想使用 tidyr 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("separate_") 中的错误: 没有适用于“字符”类对象的“单独_”方法

我们将不胜感激任何和所有的帮助!

【问题讨论】:

  • 为什么不直接将其读取为 csv 文件?
  • 您正在尝试分离字符向量c("df1", "df2", "df3", "df4"),这是不可能的。您需要一个数据框列表。
  • @gersht 很到位。您应该调用您的实际数据集名称而不是字符向量,即 df1 而不是 "df1"
  • 很有道理,谢谢你的澄清!

标签: r lapply tidyr


【解决方案1】:

您帖子下的cmets已经指出了问题。我提供了一个结合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)

separate()中的参数remove默认为TRUE,所以我忽略它。)

工作区中的df1df4 将被覆盖为分隔的表单。

【讨论】:

    【解决方案2】:

    一旦我按照@gersht 和@NelsonGon 的建议将data &lt;- list(c("df1", "df2", "df3", "df4")) 更改为data &lt;- list(df1, df2, df3, df4),您的代码实际上可以在我的机器上运行一次。您还需要删除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)) 
    }              
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 2018-01-12
      • 2023-03-13
      • 1970-01-01
      • 2022-09-24
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多