我正在从公寓出租平台的剩余api中抓取json。
假设我具有以下数据结构,该数据结构传达了单个建筑物中每个租赁单元的平方英尺:
sqft1 <- list(c("1500"),
NULL,
c("1300"))
重要的是,我要保留这些数据的维数。如果我尝试取消列表并与其他出租单元属性一起汇总到数据框中,则会丢失第二个元素并引发错误。
但是,通过在列表中找到包含NULL元素的索引,我可以将它们替换为包含空字符串的字符向量,如下所示:
isNull1 <- lapply(1:length(sqft1), function(x) is.null(sqft1[[x]]))
sqft1[unlist(isNull1)] <- c("")
当我尝试对多个建筑物的结果集应用相同的替换函数时,就会出现问题。运行以下代码块后,将无法进行替换。
sqft3 <- list(list(c("1500"),
NULL,
c("1300")),
list(c("1400"),
c("1700")),
list(NULL,
c("1200")))
isNull3 <- lapply(1:length(sqft3), function(x) lapply(1:length(sqft3[[x]]), function(y) is.null(sqft3[[x]][[y]])))
lapply(1:length(sqft3), function(x) sqft3[[x]][unlist(isNull3[[x]])] <- c(""))
我在这里对应用功能有什么误解?有什么想法使它起作用吗?
谢谢!
答案 0 :(得分:2)
一种选择是两次使用map
函数:
map(sqft3,function(x){
map(x, function(y){
y[is.null(y)] <- ""
y
})})
# [[1]]
# [[1]][[1]]
# [1] "1500"
#
# [[1]][[2]]
# [1] ""
#
# [[1]][[3]]
# [1] "1300"
#
#
# [[2]]
# [[2]][[1]]
# [1] "1400"
#
# [[2]][[2]]
# [1] "1700"
#
#
# [[3]]
# [[3]][[1]]
# [1] ""
#
# [[3]][[2]]
# [1] "1200"
数据:
sqft3 <- list(list(c("1500"),
NULL,
c("1300")),
list(c("1400"),
c("1700")),
list(NULL,
c("1200")))
sqft3
# [[1]]
# [[1]][[1]]
# [1] "1500"
#
# [[1]][[2]]
# NULL
#
# [[1]][[3]]
# [1] "1300"
#
#
# [[2]]
# [[2]][[1]]
# [1] "1400"
#
# [[2]][[2]]
# [1] "1700"
#
#
# [[3]]
# [[3]][[1]]
# NULL
#
# [[3]][[2]]
# [1] "1200"
答案 1 :(得分:2)
您可以按以下方式使用嵌套的lapply
lapply(sqft3, function (x) lapply(x, function (y) ifelse(is.null(y), "", y)))
这类似于@MKR的解决方案。
使用purrr
包,您也可以使用modify_depth
library(purrr)
modify_depth(sqft3, .depth = 2, .f = ~ifelse(is.null(.x), "", .x))
下面的ifelse
也可以被此函数%||%
取代(“空默认值”,也来自purrr
),如下所示
modify_depth(sqft3, 2, `%||%`, "")
({%||%
是if (is.null(x)) y else x
的简写)
结果
#[[1]]
#[[1]][[1]]
#[1] "1500"
#
#[[1]][[2]]
#[1] ""
#
#[[1]][[3]]
#[1] "1300"
#
#
#[[2]]
#[[2]][[1]]
#[1] "1400"
#
#[[2]][[2]]
#[1] "1700"
#
#
#[[3]]
#[[3]][[1]]
#[1] ""
#
#[[3]][[2]]
#[1] "1200"