在 R 列表中用 0 替换 numeric(0)
replace numeric(0) with 0 in R list
我有一个列表:
myList
$`0`
$`0`$item1
numeric(0)
$`0`$item2
[1] 350
$`0`$item3
numeric(0)
$`1`
$`1`$item1
numeric(0)
$`1`$item2
[1] 56
$`1`$item3
numeric(0)
我在此列表上使用了一个 sapply 函数,但出现错误:
参数'type'(列表)无效
如何将所有 numeric(0)
转换为 0,就像其他项目一样?
使用purrr
的modify()
newList <- purrr::modify(myList, ~ if(length(.) == 0){
0
} else { . })
或使用base::lapply
newList <- lapply(myList, function(x){
if(length(x) == 0){
out <- 0
} else {
out <- x
}
return(out)
})
使用嵌套 lapply
lapply(my_list, function(x) lapply(x, function(x) ifelse(length(x) == 0, 0, x)))
$`0`
$`0`$item1
[1] 0
$`0`$item2
[1] 350
$`0`$item3
[1] 0
$`1`
$`1`$item1
[1] 0
$`1`$item2
[1] 56
$`1`$item3
[1] 0
或sapply
里面lapply
lapply(my_list, function(x) sapply(x, function(x) ifelse(length(x) == 0, 0, x)))
$`0`
item1 item2 item3
0 350 0
$`1`
item1 item2 item3
0 56 0
或在内外都使用sapply
sapply(my_list, function(x) sapply(x, function(x) ifelse(length(x) == 0, 0, x)))
0 1
item1 0 0
item2 350 56
item3 0 0
上榜
my_list <- list(`0` = list(item1 = numeric(0), item2 = 350, item3 = numeric(0)),
`1` = list(item1 = numeric(0), item2 = 56, item3 = numeric(0)))
假设您只有 1 个深度列表,这是最短的解决方案
my_list[lengths(my_list) == 0] <- 0
对于 2 深度列表
my_list <- lapply(my_list, function(x)x[lengths(x) == 0] <- 0)
如果深度未知或不相等,您可以使用递归函数:
f <- function(x) {
if(is.list(x)) lapply(x, f)
else ifelse(length(x) == 0, 0, x)
}
f(myList)
#$`0`
#$`0`$item1
#[1] 0
#
#$`0`$item2
#[1] 350
#
#$`0`$item3
#[1] 0
#
#
#$`1`
#$`1`$item1
#[1] 0
#
#$`1`$item2
#[1] 56
#
#$`1`$item3
#[1] 0
#
#
#$`2`
#[1] 4
#
#$`3`
#[1] 0
数据:
myList <- list(`0` = list(item1 = numeric(0), item2 = 350, item3 = numeric(0)),
`1` = list(item1 = numeric(0), item2 = 56, item3 = numeric(0)),
`2` = 4, `3` = numeric(0))
我有一个列表:
myList
$`0`
$`0`$item1
numeric(0)
$`0`$item2
[1] 350
$`0`$item3
numeric(0)
$`1`
$`1`$item1
numeric(0)
$`1`$item2
[1] 56
$`1`$item3
numeric(0)
我在此列表上使用了一个 sapply 函数,但出现错误:
参数'type'(列表)无效
如何将所有 numeric(0)
转换为 0,就像其他项目一样?
使用purrr
的modify()
newList <- purrr::modify(myList, ~ if(length(.) == 0){
0
} else { . })
或使用base::lapply
newList <- lapply(myList, function(x){
if(length(x) == 0){
out <- 0
} else {
out <- x
}
return(out)
})
使用嵌套 lapply
lapply(my_list, function(x) lapply(x, function(x) ifelse(length(x) == 0, 0, x)))
$`0`
$`0`$item1
[1] 0
$`0`$item2
[1] 350
$`0`$item3
[1] 0
$`1`
$`1`$item1
[1] 0
$`1`$item2
[1] 56
$`1`$item3
[1] 0
或sapply
里面lapply
lapply(my_list, function(x) sapply(x, function(x) ifelse(length(x) == 0, 0, x)))
$`0`
item1 item2 item3
0 350 0
$`1`
item1 item2 item3
0 56 0
或在内外都使用sapply
sapply(my_list, function(x) sapply(x, function(x) ifelse(length(x) == 0, 0, x)))
0 1
item1 0 0
item2 350 56
item3 0 0
上榜
my_list <- list(`0` = list(item1 = numeric(0), item2 = 350, item3 = numeric(0)),
`1` = list(item1 = numeric(0), item2 = 56, item3 = numeric(0)))
假设您只有 1 个深度列表,这是最短的解决方案
my_list[lengths(my_list) == 0] <- 0
对于 2 深度列表
my_list <- lapply(my_list, function(x)x[lengths(x) == 0] <- 0)
如果深度未知或不相等,您可以使用递归函数:
f <- function(x) {
if(is.list(x)) lapply(x, f)
else ifelse(length(x) == 0, 0, x)
}
f(myList)
#$`0`
#$`0`$item1
#[1] 0
#
#$`0`$item2
#[1] 350
#
#$`0`$item3
#[1] 0
#
#
#$`1`
#$`1`$item1
#[1] 0
#
#$`1`$item2
#[1] 56
#
#$`1`$item3
#[1] 0
#
#
#$`2`
#[1] 4
#
#$`3`
#[1] 0
数据:
myList <- list(`0` = list(item1 = numeric(0), item2 = 350, item3 = numeric(0)),
`1` = list(item1 = numeric(0), item2 = 56, item3 = numeric(0)),
`2` = 4, `3` = numeric(0))