【问题标题】:add row of non-matching column types to existing dataframe将不匹配的列类型行添加到现有数据框
【发布时间】:2017-10-12 18:38:26
【问题描述】:

我想向混合列类型的现有数据框(或小标题)添加一行,该数据框仅包含每个“列”的字符。这就是我让它工作的方式,这应该足够好,但似乎这应该更容易。

df 代表了我之前创建的一个更复杂的数据框。

df <- read_csv("12, 34, 10\n10, 29, 14",
          col_names = c("part_1", 
                        "part_2", 
                        "part_3"))

c_name <- colnames(df)

info <- read_csv("blue, green, small\n0,0,0",
                 col_names = c_name) %>%
        filter(part_1 > 0)

results <- data.table::rbindlist(list(info, df))

生成正确的输出:

part_1  part_2  part_3
  blue   green   small
    12      34      10
    10      29      14

但就像我说的,在我看来,在 tidyverse 中应该有更简单的方法来做到这一点。当我使用 bind_rows 尝试这个时,我得到了错误:

“bind_rows_(x, .id) 中的错误: 无法自动将“part_1”列中的字符转换为整数。

有什么建议吗?

【问题讨论】:

  • bind_rowsbind_cols 不会隐式转换您的列类型。您正在尝试将字符列与整数列绑定。使用mutate_all 将整数转换为字符,然后再使用:bind_rows(list(info, mutate_all(df, as.character)))
  • 如果您正在为某些报告或其他内容执行此操作,更好的方法可能是使列名称中包含换行符:names(df) = paste(names(df), c("blue", "green", "small"), sep = "\n")。这将保留您的列类并可能正确打印(取决于您的输出格式)。

标签: r bind rows tidyverse


【解决方案1】:

总的来说,我想说服你不要这样做:根据定义,在 R 中,数据框列都是一种类型,在列中混合类型(在这种情况下,字符串与数值混合),强制 R 回退到最低类型,请参阅关于 Vectors May Only Have One Type on this page 的部分。

问题在于,您最终会得到一堆看起来像数字但实际上只是文本的东西——如果您需要对它们进行更多的算术或分析,那您就完蛋了。

也就是说,有时,当我为演示文稿设置表格格式时,我会打电话做类似的事情。在这种情况下,您需要先将 df 中的值强制转换为字符:

df %>%
   purrr::map_df(as.character) %>% # loop through each column and apply as.charater()
   bind_rows(info)

【讨论】:

  • 要删除 purrr 依赖项,您可以执行 df %&gt;% mutate_all(as.character) %&gt;% ...
【解决方案2】:

您可以在map 内的两个数据帧上使用mutate_all 将所有列转换为字符:

results <- purrr::map(list(info, df), function(x){
  x %>%
    mutate_all(as.character)
}) %>%
  do.call(rbind, .)

如果你真的想使用bind_rows,你可以这样做:

results <- info %>%
  mutate_all(as.character) %>%
  bind_rows(df %>%
              mutate_all(as.character))

这是假设您要确保 infodf 中的所有列都是字符,如果您确定 info 将是字符,那么您可以删除第一个 mutate_all

【讨论】:

  • 谢谢大家,所有的响应都得到了预期的结果,我最喜欢 tbradley 的 bind_rows 的最后一个选项。而且我学到了一些新东西,我不知道可以在这样的函数调用中使用管道,很酷。你是对的@crazybilly,这只是为了演示,所以在这个阶段额外的计算是必要的。
猜你喜欢
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2020-08-03
  • 2023-01-23
  • 2020-12-09
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多