簡體   English   中英

使用R,遍歷數據幀,對每個數據幀執行數學運算,將結果追加到新的數據幀中

[英]With R, iterate over data frames, perform math operations on each one, append results in new data frame

我在R中有一個巨大的數據框(A),看起來像這樣:

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

我想首先根據“頻率”(Frequency)列的值范圍(大小為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 = 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完成此操作,但是我不確定如何執行。 提前非常感謝您。

您可以使用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()創建新列(同時刪除舊列)。

具有拆分應用合並方法的基本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箱, split根據這些分箱對數據進行lapply並相應地對數據進行排序, lapplywithin用於為每個組構造新變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM