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

时间:2017-02-08 21:17:41

标签: 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

我想首先根据“频率”列(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完成,但我不确定如何。非常感谢你提前。

2 个答案:

答案 0 :(得分:2)

您可以在dplyr中使用简单的group_by执行此操作。例如,您的数据。

dd<-read.table(text="Letters   Frequency   Numbers
a         0.15        1
b         0.67        2
c         0.85        7
d         0.4         3", header=T)

你可以运行

library(dplyr)

dd %>% 
    group_by(bin=cut(Frequency, breaks=seq(0,1,by=.25))) %>% 
    transmute(op1=Numbers-2, op2=Numbers*10) %>% 
    arrange(bin)

我们使用cut()创建分箱组,然后使用transmute()创建新列(同时删除旧列)。

答案 1 :(得分:2)

使用split-apply-combine方法的基本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根据这些分档对数据框进行分割并相应地对数据进行排序,使用lapplywithin为每个组构建新变量。