【问题标题】:Changing Class of Column Across Multiple Dataframes跨多个数据框更改列的类别
【发布时间】:2020-06-27 13:49:13
【问题描述】:

我有一个包含 59 个数据框的列表,我想将它们合并在一起。不幸的是,因为我已经刮掉了很多,数据框中的列有不同的类。它们都有“名称”列,有些是因子形式,有些是字符形式。我想将它们全部更改为字符形式。我尝试了以下

dts <- c("Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida",
               "Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine",
               "Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska",
               "Nevada","New_Hampshire","New_Jersey","New_Mexico","New_York","North_Carolina","North_Dakota",
               "Ohio","Oklahoma","Oregon","Pennsylvania","Rhode_Island","South_Carolina","South_Dakota","Tennessee",
               "Texas","Utah","Vermont","Virginia","Washington","West_Virginia","Wisconsin","Wyoming","Federal",
               "CCJail","DC","LAJail","NOLA","NYCJail","OCJail","PhilJail","TXJail")


for(i in 1:length(dts)){
        dts[i]$Name <- as.character(dts[i]$Name)
}

但它只给了我错误“错误:$ 运算符对原子向量无效”。 有谁知道一个好的解决方法?提前感谢您的帮助!

我的最终目标是跑步

dta <-dplyr::bind_rows(Alabama,Alaska,Arizona,Arkansas,California,Colorado,Connecticut,Delaware,Florida,
       Georgia,Hawaii,Idaho,Illinois,Indiana,Iowa,Kansas,Kentucky,Louisiana,Maine,
       Maryland,Massachusetts,Michigan,Minnesota,Mississippi,Missouri,Montana,Nebraska,
       Nevada,New_Hampshire,New_Jersey,New_Mexico,New_York,North_Carolina,North_Dakota,
       Ohio,Oklahoma,Oregon,Pennsylvania,Rhode_Island,South_Carolina,South_Dakota,Tennessee,
       Texas,Utah,Vermont,Virginia,Washington,West_Virginia,Wisconsin,Wyoming,Federal,CCJail,
       DC,LAJail,NOLA,NYCJail,OCJail,PhilJail,TXJail)

但我收到错误“错误:无法组合 ..1$Residents.Confirmed..2$Residents.Confirmed 。”每个数据框中都有大量的列,而且它们经常是不同的类。如果有人有更优雅的解决方案,我也会对此持开放态度!谢谢!

【问题讨论】:

  • 您只需要更改“名称”列类还是所有列?
  • @arkun 我需要更改所有列(一些为字符,一些为数字)。谢谢!
  • 不清楚。因为它也可能在每个数据集中有所不同。我添加了一个解决方案来更改所有字符然后绑定它们

标签: r dataframe dplyr


【解决方案1】:

我们可以将数据集加载到listmget(假设数据集对象已经在全局环境中创建)然后循环listmap,更改classmutate 中的“名称”列和 map 中的后缀 _dfr 绑定的行

library(dplyr)
library(purrr)
out <- map_dfr(mget(dts), ~ .x %>% 
                  mutate(Name = as.character(Name)))

如果有很多不同的列class。可能,最好将所有列转换为单个类,然后绑定

out <- map_dfr(mget(dts), ~ .x %>%
                   mutate(across(everything(), as.character)))
out <- type.convert(out, as.is = TRUE)

如果dplyr 版本是&lt; 1.0.0,请使用mutate_all

out <- map_dfr(mget(dts), ~ .x %>%
               mutate_all(as.character))

【讨论】:

  • 感谢您的帮助!现在,当我运行您建议的代码时,它会给出以下错误:错误:mutate() 输入问题..1。 x 无法回收 ..1(尺寸 507)以匹配 ..20(尺寸 22)。 ℹ 输入..1across(everything(), as.character)
  • 当我运行 rlang::last_error() 时,我得到 mutate() 输入 ..1 的问题。 x 无法回收 ..1(尺寸 507)以匹配 ..20(尺寸 22)。 ℹ 输入..1across(everything(), as.character)。回溯: 1. purrr::map_dfr(...) 2. purrr::map(.x, .f, ...) 3. global::.f(.x[[i]], ...) 12. dplyr::mutate(., cross(everything(), as.character)) 14. dplyr:::mutate_cols(.data, ...)
  • @babybonobo dplyr的版本是什么我用的1.0.0
  • @babybonobo 你能在更新中尝试mutate_all
  • 我使用的是 1.0.0。谢谢您的帮助!我尝试了mutate_all 选项,但现在它给了我错误错误:无效索引:超出范围
【解决方案2】:
d1 <- data.frame(
  Name = as.factor(c("name1", "name2")),
  Residents.Confirmed = c(0,1)
  )
d2 <- data.frame(
  Name = c("name3", "name4"),
  Residents.Confirmed = c(2,3)
)
dataframes_list <- list(d1, d2)
for(i in 1:length(dataframes_list)){
  dataframes_list[[i]]$Name <- as.character(dataframes_list[[i]]$Name)
}
bind_rows(dataframes_list)

【讨论】:

    【解决方案3】:

    基础 R 解决方案:

    type.convert(do.call("rbind", 
            Map(function(x){data.frame(lapply(x, as.character))}, dataframes_list)))
    

    数据感谢@chase171:

    d1 <- data.frame(
      Name = as.factor(c("name1", "name2")),
      Residents.Confirmed = c(0,1)
    )
    d2 <- data.frame(
      Name = c("name3", "name4"),
      Residents.Confirmed = c(2,3)
    )
    dataframes_list <- list(d1, d2)
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 1970-01-01
      • 2018-12-24
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多