[英]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
並相應地對數據進行排序, lapply
和within
用於為每個組構造新變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.