将列表的每个元素中的列转换为字符串
Posted
技术标签:
【中文标题】将列表的每个元素中的列转换为字符串【英文标题】:Convert the columns in each element of a list to strings 【发布时间】:2022-01-19 08:54:27 【问题描述】:假设我有一个包含 3 个元素的列表 x
、y
和 z
。每个列表中的列都是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】:使用dplyr
和purrr
-
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)
【讨论】:
以上是关于将列表的每个元素中的列转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章