【问题标题】:How do I efficiently process a large dataframe row-by-row?如何有效地逐行处理大型数据帧?
【发布时间】:2020-02-12 19:34:18
【问题描述】:

我有一个想要处理的大型数据框(10,000,000+ 行)。我也是 R 的新手,想更好地了解如何处理这样的大型数据集。

我有一个公式,我想将其应用于数据框中的每一行。但是我从经验中发现,“for 循环”和“应用”对于非常大的数据集并不能很好地工作。我一直在尝试使用拆分应用组合,但是当我想逐行应用函数时,我不太明白如何使用它。

这是一个包含 1,000,000 行的示例数据框。我想应用一个函数,它需要每一行,并在两列上执行一个简单的乘法以给出一个输出(我意识到我可以更容易地做到这一点,但我想练习拆分-应用-组合)。

#make a dataframe
df <- data.frame("a"=c(rep("group1",times=500000),rep("group2",times=500000)),
                 "b"=c(1:1000000),"c"=c(1000001:2000000))

我想要做什么:对于每一行,我想将“b”列中的值乘以“c”列中的值

【问题讨论】:

  • 如果你在做成对乘法,没有理由分割/分组。我知道您说过您正在寻求练习,但是在 R 中高效编程的最重要部分就是尽可能使用矢量化操作。 df$b*df$c
  • 如果您想了解有关高效分组操作的更多信息,我会查看data.table 包。具体来说,data.table gforce 优化允许非常有效地计算少量的数学分组运算,如求和、均值等。
  • 这里的“分裂”有什么意义?
  • 如果我有一个更复杂的数据框可以使用怎么办?例如,假设我有一个包含 2 个类别(A 和 B)的数据框,我想使用这两个类别从“查找数据框”中查找一个值。对于一个小数据集,我只需逐行(使用 for 循环或应用),在查找数据框中查找“A 类”和“B 类”,然后插入来自查找数据框的任何值。但是,对于大数据框,这不会那么快......

标签: r large-data split-apply-combine


【解决方案1】:

您不需要使用 apply 或其他功能。举个小例子:

df <- data.frame("a"=c(rep("group1",times=5),rep("group2",times=5)),
                 "b"=c(1:10),"c"=c(11:20))
df
       a  b  c
1  group1  1 11
2  group1  2 12
3  group1  3 13
4  group1  4 14
5  group1  5 15
6  group2  6 16
7  group2  7 17
8  group2  8 18
9  group2  9 19
10 group2 10 20

我可以这样做:

df$d = df$b *df$c #create a new column called d
df
       a  b  c   d
1  group1  1 11  11
2  group1  2 12  24
3  group1  3 13  39
4  group1  4 14  56
5  group1  5 15  75
6  group2  6 16  96
7  group2  7 17 119
8  group2  8 18 144
9  group2  9 19 171
10 group2 10 20 200

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多