我经常遇到这样的数据 struct :

employees <- list(
    list(id = 1,
             dept = "IT",
             age = 29,
             sportsteam = "softball"),
    list(id = 2,
             dept = "IT",
             age = 30,
             sportsteam = NULL),
    list(id = 3,
             dept = "IT",
             age = 29,
             sportsteam = "hockey"),
    list(id = 4,
             dept = NULL,
             age = 29,
             sportsteam = "softball"))

在许多情况下,这样的列表可能长达数千万项,因此内存问题和效率始终是一个问题.

我想将列表转换为数据帧,但如果我运行:

library(data.table)
employee.df <- rbindlist(employees)

我会因为空值而出错.我通常的策略是使用如下函数:

nullToNA <- function(x) {
    x[sapply(x, is.null)] <- NA
    return(x)
}

然后:

employees <- lapply(employees, nullToNA)
employee.df <- rbindlist(employees)

它回来了

   id dept age sportsteam
1:  1   IT  29   softball
2:  2   IT  30         NA
3:  3   IT  29     hockey
4:  4   NA  29   softball

然而,当应用于1000万个 case 时,nullToNA函数非常慢,因此如果有更有效的方法,那就更好了.

有一点似乎减缓了这个过程,那就是.null函数一次只能应用于一个项目(与is.na不同,is.na可以一次扫描完整列表).

关于如何在大型数据集上高效地执行此操作,有什么建议吗?

推荐答案

R中的许多效率问题都是通过首先将原始数据转换为一种形式来解决的,这种形式可以使后续的过程尽可能快速和简单.通常,这是矩阵形式.

如果将所有数据与rbind结合在一起,nullToNA函数就不再需要通过嵌套列表进行搜索,因此sapply可以更有效地实现其目的(通过矩阵进行搜索).从理论上讲,这应该会使过程更快.

顺便提一下,问得好.

> dat <- do.call(rbind, lapply(employees, rbind))
> dat
     id dept age sportsteam
[1,] 1  "IT" 29  "softball"
[2,] 2  "IT" 30  NULL      
[3,] 3  "IT" 29  "hockey"  
[4,] 4  NULL 29  "softball"

> nullToNA(dat)
     id dept age sportsteam
[1,] 1  "IT" 29  "softball"
[2,] 2  "IT" 30  NA        
[3,] 3  "IT" 29  "hockey"  
[4,] 4  NA   29  "softball"

R相关问答推荐

使用split.zoo界定xts物体的降水事件

如何将y轴上的线定位得彼此更近

如何使用stat_extract_all正确提取我的目标值?

咕噜中的元素列表:map

gt()从gt为相同内容的单元格 colored颜色 不同?

用相同方法得到不同函数的ROC最优截断值

如何编辑gMarginal背景以匹配绘图背景?

使用列/行匹配将两个不同维度的矩阵相加

在R gggplot2中是否有一种方法将绘图轴转换成连续的 colored颜色 尺度?

方法::slotName如何处理非类、非字符的参数?

R中1到n_1,2到n_2,…,n到n_n的所有组合都是列表中的向量?

R:用GGPLATE,如何在两个独立的变量中制作不同形状的散点图?

R如何计算现有行的总和以添加新的数据行

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

将列的值乘以在不同数据集中找到的值

无法将条件case_when()应用于使用!!创建的新变量Mutations

Conditional documentr::R中数据帧的summarize()

用满足特定列匹配的另一行替换NA行

如何移动点以使它们的打印不重叠

生存时间序列的逻辑检验