r - 使用 R,迭代数据帧,对每个数据帧执行数学运算,将结果附加到新数据帧中

标签 r loops dataframe lapply

我在 R 中有一个巨大的数据框 (A),如下所示:

Letters   Frequency   Numbers
a         0.15        1
b         0.67        2
c         0.85        7
d         0.4         3

我想首先根据“Frequency”列的值范围(4个大小为0.25的频率仓)将A分为4个数据框,从0到1,这样我得到:

A1 [0, 0.25]

Letters   Frequency   Numbers
a         0.15        1

A2 [0.25, 0.5]

Letters   Frequency   Numbers
d         0.4         3

A3 [0.5, 0.75]

Letters   Frequency   Numbers
b         0.67        2

A4 [0.75, 1]

Letters   Frequency   Numbers
c         0.85        7

以迭代方式并遵循频率仓的顺序,我想在 A1、A2、A3 和 A4 中执行数学运算(例如,op1 = Numbers - 2;op2 = Numbers * 10)并创建数据带有附加结果的帧 B:

B

bin            op1    op2   
[0, 0.25]      -1     10 
[0.25, 0.5]     1     30 
[0.5, 0.75]     0     20 
[0.75, 1]       5     70

我想我不需要创建 A1、A2、A3 和 A4(理想情况下我只想使用 A)并且有一种更优雅的方法可以通过直接迭代频率仓来获取 B,但是我在这个例子中创建它们是为了清楚地解释原理。我认为这可以通过 lapply 完成,但我不确定如何完成。预先非常感谢您。

最佳答案

采用拆分-应用-组合方法的基本 R 方法是

do.call(rbind, lapply(split(dd, findInterval(dd$Frequency, c(0, .25, .5, .75, 1))),
                      function(i) within(i, { # create variables, remove Numbers
                                         op1 <- Numbers - 2
                                         op2 <- Numbers * 10
                                         Numbers <- NULL})))

这会返回

  Letters Frequency op2 op1
1       a      0.15  10  -1
2       d      0.40  30   1
3       b      0.67  20   0
4       c      0.85  70   5

这里,findInterval 根据频率对观测值进行分箱,split 根据这些分箱分割 data.frame 并相应地对数据进行排序,lapply > 和 within 用于为每个组构造新变量。

关于r - 使用 R,迭代数据帧,对每个数据帧执行数学运算,将结果附加到新数据帧中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42123780/

相关文章:

r - 使用连续变量更改 geom_dotplot 或 geom_histogram 的填充/颜色

r - 安装 Bioconductor 软件包

c - OMP 使用 if 语句优化嵌套循环

python - 如何标记唯一值?

python - 数据操作 - 当值为字母数字时排序索引

R pivot_wider 所以重复行成为标题

r - 为什么 $ 与线性模型的摘要不部分匹配?

c - 在 C 中执行 while 循环

python - 在 for 循环中将数据帧 append 在一起

python - 格式化数据集的问题