在R中使用混合类型将字符数字转换为嵌套列表中的数字
Convert chararacter numbers to numeric in nested list with mixed types in R
我有一堆嵌套列表,其中包含所有字符类型的元素。其中一些字符实际上是需要转换为数字类型元素的数字。
如何修改这些列表,以便所有可能的字符类型数字都转换为数字,但非数字字符元素保持不变(例如,不被 [=13 转换为 NA
=])?
例如,我从
开始
raw_list <- list(
'a' = list('1', '2'),
'b' = list(
'c' = list('3', 'x'),
'd' = c('4', 'z'),
'e' = '5'))
但我需要去
cleaned_list <- list(
'a' = list(1, 2),
'b' = list(
'c' = list(3, 'x'),
'd' = c('4', 'z'),
'e' = 5))
奖金: tidyverse/purrr-based 解决方案的额外感谢
您可以使用 readr::parse_guess
将字符类型的数字转换为数字类型的数字,而无需将字符转换为 NA
s。
我还创建了一个函数来转换嵌套列表中的数字。
请注意,您不能将字符和数字存储在同一个向量中。
希望对您有所帮助。
library(tidyverse)
func_parse_list <- function(l){
if(length(l)>1){
map(l, func_parse_list) %>% return()
}else{
parse_guess(l) %>% return()
}
}
list('a' = list('1', '2'),
'b' = list(
'c' = list('3', 'x'),
'd' = c('4', 'z'),
'e' = '5')) %>%
func_parse_list()
#> $a
#> $a[[1]]
#> [1] 1
#>
#> $a[[2]]
#> [1] 2
#>
#>
#> $b
#> $b$c
#> $b$c[[1]]
#> [1] 3
#>
#> $b$c[[2]]
#> [1] "x"
#>
#>
#> $b$d
#> $b$d[[1]]
#> [1] 4
#>
#> $b$d[[2]]
#> [1] "z"
#>
#>
#> $b$e
#> [1] 5
由 reprex package (v2.0.1)
于 2021-12-05 创建
另一种选择是使用 type.convert
,它可以将列表作为参数。
raw_list %>%
type.convert(as.is = TRUE)
这与使用 purrr
和 type.convert
相同。
library(purrr)
purrr::map(raw_list, type.convert, as.is = TRUE)
输出
$a
$a[[1]]
[1] 1
$a[[2]]
[1] 2
$b
$b$c
$b$c[[1]]
[1] 3
$b$c[[2]]
[1] "x"
$b$d
[1] "4" "z"
$b$e
[1] 5
我有一堆嵌套列表,其中包含所有字符类型的元素。其中一些字符实际上是需要转换为数字类型元素的数字。
如何修改这些列表,以便所有可能的字符类型数字都转换为数字,但非数字字符元素保持不变(例如,不被 [=13 转换为 NA
=])?
例如,我从
开始raw_list <- list(
'a' = list('1', '2'),
'b' = list(
'c' = list('3', 'x'),
'd' = c('4', 'z'),
'e' = '5'))
但我需要去
cleaned_list <- list(
'a' = list(1, 2),
'b' = list(
'c' = list(3, 'x'),
'd' = c('4', 'z'),
'e' = 5))
奖金: tidyverse/purrr-based 解决方案的额外感谢
您可以使用 readr::parse_guess
将字符类型的数字转换为数字类型的数字,而无需将字符转换为 NA
s。
我还创建了一个函数来转换嵌套列表中的数字。 请注意,您不能将字符和数字存储在同一个向量中。
希望对您有所帮助。
library(tidyverse)
func_parse_list <- function(l){
if(length(l)>1){
map(l, func_parse_list) %>% return()
}else{
parse_guess(l) %>% return()
}
}
list('a' = list('1', '2'),
'b' = list(
'c' = list('3', 'x'),
'd' = c('4', 'z'),
'e' = '5')) %>%
func_parse_list()
#> $a
#> $a[[1]]
#> [1] 1
#>
#> $a[[2]]
#> [1] 2
#>
#>
#> $b
#> $b$c
#> $b$c[[1]]
#> [1] 3
#>
#> $b$c[[2]]
#> [1] "x"
#>
#>
#> $b$d
#> $b$d[[1]]
#> [1] 4
#>
#> $b$d[[2]]
#> [1] "z"
#>
#>
#> $b$e
#> [1] 5
由 reprex package (v2.0.1)
于 2021-12-05 创建另一种选择是使用 type.convert
,它可以将列表作为参数。
raw_list %>%
type.convert(as.is = TRUE)
这与使用 purrr
和 type.convert
相同。
library(purrr)
purrr::map(raw_list, type.convert, as.is = TRUE)
输出
$a
$a[[1]]
[1] 1
$a[[2]]
[1] 2
$b
$b$c
$b$c[[1]]
[1] 3
$b$c[[2]]
[1] "x"
$b$d
[1] "4" "z"
$b$e
[1] 5