如何将含数值与字符的嵌套列拆分为单一字符列?
问题描述
使用arsenal包的comparedf函数对比两个数据框生成差异报告时,需要拆分结果中的嵌套列(values.x和values.y)以导出到Excel,但这两列同时包含数值(double)和字符(character)类型的嵌套元素,直接用tidyr::unnest会报错:
Can't combine `x[[1]]` <double> and `x[[4]]` <character>.
示例数据
df1 <- data.frame(id = c("a", "b", "c", "d","e"), var = c(1, 2, 3, 4, 5), var2 = c("A","B","C","A","B")) df2 <- data.frame(id = c("a", "b", "c", "d","e"), var =c(1,3,4,2,5), var2 = c("C","A","C","A","B"))
对比代码及报错操作
library(arsenal) summary(comparedf(df1, df2, by="id")) # 尝试拆分嵌套列时报错 library(tidyr) vec1 <- summary(comparedf(df1, df2, by="id")) diftable <- vec1$diffs.table |> unnest(cols = c(values.x, values.y))
解决方案
核心思路是先将嵌套列中的所有元素统一转为字符类型,再执行拆分操作,避免类型冲突。可以借助purrr::map函数遍历嵌套列表的每个元素并转换类型:
library(arsenal) library(tidyr) library(purrr) # 生成示例数据 df1 <- data.frame(id = c("a", "b", "c", "d","e"), var = c(1, 2, 3, 4, 5), var2 = c("A","B","C","A","B")) df2 <- data.frame(id = c("a", "b", "c", "d","e"), var =c(1,3,4,2,5), var2 = c("C","A","C","A","B")) # 获取对比结果 vec1 <- summary(comparedf(df1, df2, by="id")) diftable <- vec1$diffs.table # 将嵌套列的每个元素转为字符型 diftable <- diftable |> mutate( values.x = map(values.x, as.character), values.y = map(values.y, as.character) ) # 拆分嵌套列 diftable_unnested <- unnest(diftable, cols = c(values.x, values.y))
执行后,diftable_unnested中的values.x和values.y会变成统一的字符类型列,可直接导出到Excel。
内容的提问来源于stack exchange,提问作者Victor Shin
相关产品推荐
相关产品推荐

