Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R,迭代数据帧,对每个数据帧执行数学运算,将结果附加到新的数据帧中_R_Loops_Dataframe_Lapply - Fatal编程技术网

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

使用R,迭代数据帧,对每个数据帧执行数学运算,将结果附加到新的数据帧中,r,loops,dataframe,lapply,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 首先,我想根据“频率”列(大小为0.25的4个频率箱)的值范围将A划分为4个数据帧,从0到1,这样我可以得到: A1 [0, 0.25] Letters Frequency Number

我在R中有一个巨大的数据帧(a),看起来像这样:

Letters   Frequency   Numbers
a         0.15        1
b         0.67        2
c         0.85        7
d         0.4         3
首先,我想根据“频率”列(大小为0.25的4个频率箱)的值范围将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=数字-2;op2=数字*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来完成,但我不确定如何完成。非常感谢您的光临。

您可以通过dplyr中的一个简单的
groupby
来实现这一点。例如,使用您的数据

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)

我们使用
cut()

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})))

在这里,
findInterval
bin根据频率对观察结果进行分类,
split
对数据进行分类。frame基于这些bin并对数据进行相应排序,
lappy
in
用于为每组构建新的变量。

谢谢@MrFlick,它也按您的方式工作。我想问一下,如果我想对包含特定列中所有行(例如“字母”)具有特定单词(例如“genic”)的子数据帧执行这些数学运算,您将如何迭代(或使用dplyr)执行这些运算。问题是这些词是在一个上下文中出现的,比如“基因型/内含子型/错义”,因此我不能单独用“基因型”来对_进行分组。我知道如何使用grepl提取这些子数据帧并手动执行,但我无法以优雅的方式执行。非常感谢。不清楚你的确切意思。你应该像在这个问题上那样,用一个可复制的示例创建一个新帖子,其中包含样本输入和所需的输出。非常感谢@Imo。如果你对我发布的最后一条评论有反馈,那就太好了。如果你在flick先生的回答中提到你的评论,我很难将其可视化。从我的第二次阅读来看,这似乎已经足够不同,可以作为一个新的问题,用一个很好的例子来说明这个问题。
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