【问题标题】: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 第一个答案效果很好。

标签: r list


【解决方案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})
    

    【讨论】:

      猜你喜欢
      • 2015-05-15
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多