[英]R: How to calculate the difference between each value of a dataframe with all elements of another dataframe in the same row?
[英]calculate difference between successive number and use to output to another dataframe in R
我有以下數據集
mark <- c("0", "A", "B", "C", "D", "E")
phy <- c(0, 1, 10, 15, 18, 20)
gen <- c(0, 3, 35.0, 55, 60, 65)
mydata <- data.frame (mark, phy, gen)
mark phy gen
1 0 0 0
2 A 1 3
3 B 10 35
4 C 15 55
5 D 18 60
6 E 20 65
我希望減去phy和gen中的連續數字(1從2,2從3開始,依此類推到結束)並計算比率,例如第一種情況
(phy[2] - phy[1]) / (gen[2] - gen[1])
類似的第二種情況將是
(phy[3] - phy[2]) / (gen[3] - gen[2])
等等 ....
因此輸出將是
phydis <- phy[i+1] - phy[i], where i is 1:6 (end of the data frame)
ratio <- (phy[i+1] - phy[i]) / (gen[i+1] - gen[i])
我的手動計算:
phydis <- c(1, 9, 5, 3, 2)
disg <- c(3, 32, 20, 5, 5)
ratio <- phydis / disg
ratio
[1] 0.3333333 0.2812500 0.2500000 0.6000000 0.4000000
該比率是第二數據集的轉換因子。 如果上述數據集中兩個phy值之間的任何值將乘以相應的比率。
我的第二個數據集:
mark <- c("i", "k", "l", "m", "n", "o", "p")
phy <- c(3, 11, 12, 15, 17,18, 20)
mydf2 <- data.frame(mark, phy)
mark phy
1 i 3
2 k 11
3 l 12
4 m 15
5 n 17
6 o 18
7 p 20
由於標記i落在mydata $ phy 1-10之間,將乘以比率0.2812500,類似標記k phy值落在mydata $ phy 10-15之間,將乘以比率0.2500000。 因此,完整的數學是
mark phy gen
1 i 3 3 * 0.2812500
2 k 11 11* 0.2500000
3 l 12 12 * 0.2500000
4 m 15 15 * 0.2500000
5 n 17 17 * 0.6000000
6 o 18 18 * 0.6000000
7 p 20 20 * 0.4000000
與此處提供的數據集不同,我有一個大數據集可供使用。
編輯:
讓我說清楚第二部分:
基於第一部分我們計算間隔之間的比率 -
0 - 1, 1-10, 10-15, 15-18, 18-20
0.3333333 0.2812500 0.2500000 0.6000000 0.4000000
現在,乘積因子將取決於mydf2 $ phy值在這些區間內的下降。 例如,第一個值mydf2 $ phy = 3,它落在1-10之間,因此將乘以0.2812500,第二個值是11,它落在10-15之間,因此將乘以0.2500000,依此類推。
擴展Dason的答案:
mark <- c("0", "A", "B", "C", "D", "E")
phy <- c(0, 1, 10, 15, 18, 20)
gen <- c(0, 3, 35.0, 55, 60, 65)
mydata <- data.frame (mark, phy, gen)
ratio <- diff(mydata$phy)/diff(mydata$gen)
mark <- c("i", "k", "l", "m", "n", "o", "p")
phy <- c(3, 11, 12, 15, 17,18, 20)
mydf2 <- data.frame(mark, phy)
mydf2$cat.phy <- cut(mydf2$phy, mydata$phy)
key <- data.frame(cat=levels(cut(mydf2$phy, mydata$phy)), ratio=ratio)
mydf2$gen <- mydf2$phy * key[match(mydf2$cat.phy, key$cat), 'ratio']
mydf2
產量:
> mydf2
mark phy cat.phy gen
1 i 3 (1,10] 0.84375
2 k 11 (10,15] 2.75000
3 l 12 (10,15] 3.00000
4 m 15 (10,15] 3.75000
5 n 17 (15,18] 10.20000
6 o 18 (15,18] 10.80000
7 p 20 (18,20] 8.00000
這可以照顧你的第一個問題:
# diff gives the successive differences
ratio <- diff(phy)/diff(gen)
並且我不清楚你是如何得到數字乘以你的第二個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.