向现有数据框添加一行不匹配的列类型
add row of non-matching column types to existing dataframe
我想向混合列类型的现有数据框(或 tibble)添加一行,每个 'column' 只包含字符。这就是我让它工作的方式,这应该足够好,但似乎这应该更容易。
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 尝试此操作时,出现错误:
"Error in bind_rows_(x, .id) :
Can not automatically convert from character to integer in column "part_1".
有什么建议吗?
您可以在 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))
假设您想确保 info
和 df
中的所有列都是字符,如果您确定 info
将是字符,那么您可以删除首先 mutate_all
总的来说,我想说服你不要这样做:根据定义,在 R 中,数据框列都是一种类型,列中混合类型(在这种情况下,字符串与数值混合), 强制 R 回落到最低类型,参见关于 Vectors May Only Have One Type on this page.
的部分
问题是您最终会得到一堆看起来像数字但实际上只是文本的东西——如果您需要对它们进行更多的算术或分析,您就会被淘汰。
就是说,当我格式化 table 以供演示时,我偶尔会被要求做类似的事情。在这种情况下,您需要先将 df 中的值强制转换为字符:
df %>%
purrr::map_df(as.character) %>% # loop through each column and apply as.charater()
bind_rows(info)
我想向混合列类型的现有数据框(或 tibble)添加一行,每个 'column' 只包含字符。这就是我让它工作的方式,这应该足够好,但似乎这应该更容易。
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 尝试此操作时,出现错误:
"Error in bind_rows_(x, .id) : Can not automatically convert from character to integer in column "part_1".
有什么建议吗?
您可以在 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))
假设您想确保 info
和 df
中的所有列都是字符,如果您确定 info
将是字符,那么您可以删除首先 mutate_all
总的来说,我想说服你不要这样做:根据定义,在 R 中,数据框列都是一种类型,列中混合类型(在这种情况下,字符串与数值混合), 强制 R 回落到最低类型,参见关于 Vectors May Only Have One Type on this page.
的部分问题是您最终会得到一堆看起来像数字但实际上只是文本的东西——如果您需要对它们进行更多的算术或分析,您就会被淘汰。
就是说,当我格式化 table 以供演示时,我偶尔会被要求做类似的事情。在这种情况下,您需要先将 df 中的值强制转换为字符:
df %>%
purrr::map_df(as.character) %>% # loop through each column and apply as.charater()
bind_rows(info)