向现有数据帧添加一些不匹配的列类型

时间:2017-10-12 18:38:26

标签: r bind rows tidyverse

我想在混合列类型的现有数据框(或tibble)中添加一行,其中只包含每个列的字符'。这就是我如何使用它,这应该足够好但似乎这应该更容易。

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

但就像我说的那样,在我看来应该有一种更简单的方法来保持整齐。当我通过使用bind_rows尝试这个时,我得到了错误:

  

&#34; bind_rows_(x,.id)出错:         列#34; part_1&#34;。

中无法自动从字符转换为整数

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

总的来说,我想说服你不要这样做:根据定义,在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)

答案 1 :(得分:1)

您可以在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))

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

df

这假设您要确保infomutate_all中的所有列都是字符,如果您确定{{1}}将是字符,那么您可以放弃第一个{ {1}}