将列表的每个元素中的列转换为字符串

Posted

技术标签:

【中文标题】将列表的每个元素中的列转换为字符串【英文标题】:Convert the columns in each element of a list to strings 【发布时间】:2022-01-19 08:54:27 【问题描述】:

假设我有一个包含 3 个元素的列表 xyz。每个列表中的列都是double 类型。有没有一种快速的方法可以将所有的列转换为字符串?

dput(mylist)
list(structure(list(Age = c(1L, 1L, 2L, 3L, 4L, 5L), Year = c(10L, 
11L, 10L, 11L, 10L, 12L)), class = "data.frame", row.names = c(NA, 
-6L)), structure(list(Age = c(1L, 1L, 2L, 3L, 4L, 5L), Year = c(12L, 
14L, 10L, 11L, 5L, 12L)), class = "data.frame", row.names = c(NA, 
-6L)), structure(list(Age = c(1L, 1L, 2L, 3L, 4L, 5L), Year = c(12L, 
14L, 10L, 11L, 5L, 12L)), class = "data.frame", row.names = c(NA, 
-6L)))

我用lapply 尝试了各种方法,但都做不到。

【问题讨论】:

试试lapply(mylist, function(i) i[] <- lapply(i, as.character); i) 而且,只是提供第二种选择:lapply(mylist, lapply, as.character) |> lapply(data.frame) @Sotos 第一个答案效果很好。 【参考方案1】:

你可以试试rapply

res <- rapply(
  mylist,
  as.character,
  how = "replace"
)

你会看到

> res
[[1]]
  Age Year
1   1   10
2   1   11
3   2   10
4   3   11
5   4   10
6   5   12

[[2]]
  Age Year
1   1   12
2   1   14
3   2   10
4   3   11
5   4    5
6   5   12

[[3]]
  Age Year
1   1   12
2   1   14
3   2   10
4   3   11
5   4    5
6   5   12

> str(res)
List of 3
 $ :'data.frame':       6 obs. of  2 variables:
  ..$ Age : chr [1:6] "1" "1" "2" "3" ...
  ..$ Year: chr [1:6] "10" "11" "10" "11" ...
 $ :'data.frame':       6 obs. of  2 variables:
  ..$ Age : chr [1:6] "1" "1" "2" "3" ...
  ..$ Year: chr [1:6] "12" "14" "10" "11" ...
 $ :'data.frame':       6 obs. of  2 variables:
  ..$ Age : chr [1:6] "1" "1" "2" "3" ...
  ..$ Year: chr [1:6] "12" "14" "10" "11" ...

【讨论】:

【参考方案2】:

使用dplyrpurrr -

library(dplyr)
library(purrr)

mylist <- map(mylist, ~.x %>% mutate(across(.fns = as.character))) 
str(mylist)

#List of 3
# $ :'data.frame':  6 obs. of  2 variables:
#  ..$ Age : chr [1:6] "1" "1" "2" "3" ...
#  ..$ Year: chr [1:6] "10" "11" "10" "11" ...
# $ :'data.frame':  6 obs. of  2 variables:
#  ..$ Age : chr [1:6] "1" "1" "2" "3" ...
#  ..$ Year: chr [1:6] "12" "14" "10" "11" ...
# $ :'data.frame':  6 obs. of  2 variables:
#  ..$ Age : chr [1:6] "1" "1" "2" "3" ...
#  ..$ Year: chr [1:6] "12" "14" "10" "11" ...

或仅使用 purrr 的较短版本(@Konrad Rudolph 建议)

map(mylist, map_dfr, as.character)

【讨论】:

较短的“咕噜”:purrr::map(x, purrr::map_dfc, as.character)【参考方案3】:

带双lapply

lapply(mylist, function(i) i[] <- lapply(i, as.character); i)

【讨论】:

以上是关于将列表的每个元素中的列转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 将列表列转换为嵌套结构列

如何将矩阵转换为 R 中的列向量列表?

如何将矩阵转换为R中的列向量列表?

列表的列,将列表转换为字符串作为新列

如何将字符串字典转换为字典并拆分为单独的列

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?