我有一個資料框架,我想根據前面的行做一些計算(就像在excel中向下拖動資訊)。我的DF看起來像這樣:
set.seed(1234)
df <- data. frame(DA = sample(1。 3, 6。 rep = TRUE) 。 HB = sample(0。 600, 6。 rep = TRUE)。 D = samples(1: 5, 6。 rep = TRUE)。 AD = sample(1。 14, 6。 rep = TRUE)。 GM = sample(30。 31, 6。 rep = TRUE)。 GL = NA, R =NA。 RM =0 )
df$GL[1]/span> = 646
df$R[1]/span> = 60
df$DA[5]/span> = 2
df
# DA HB D AD GM GL R RM
# 1 2 399 4 13 30 646 60 0
# 2 2 97 4 10 31 NA NA 0
# 3 1 102 5 5 31 NA NA 0
# 4 3 325 4 2 31 NA 0
# 5 2 78 3 14 30 NA 0
# 6 1 269 4 8 30 NA 0
我想填補我的GL、R和RM列中的缺失值,而且這些值是相互依賴的。因此,例如:
attach(df)
#calc GL和R為第二行。
df$GL[2] < -GL[1] HB[2] RM[1]
df$R[2]/span> < -df$GL[/span>2]*D[/span>2]/GM[/span>2]*AD[/span>2]
#calc GL和R為第三行。
df$GL[3] < -df$GL[/span>2] HB[2/span>3] df$RM[2]
df$R[3]/span> < -df$GL[/span>3]*D[/span>3]/GM[/span>3]*AD[/span>3]
#and so on...。
是否有辦法一次性完成所有的計算,而不是逐行計算?
此外,每次列'DA'=2時,'R'的前一個值應該為'RM'的同一行求和,但只從最后一次出現開始。因此,
attach(df)
df$RM[3] < -R[1] R[2] R[3]
#and RM for the 6th row is calculated by.
#df$RM[6] <-R[4] R[5] R[6]
預先感謝!
uj5u.com熱心網友回復:
你可以使用一個for回圈來計算GL值,一旦你得到它們,你可以直接對R列進行計算。
for(i in 2: nrow(df)) {
df$GL[i] < -與(df, GL[/span>i-1] HB[/span>i] RM[i- 1])
}
df$R < -與(df。 (GL* D)/(GM *AD))
uj5u.com熱心網友回復:
你可以使用索引來解決前兩個問題:
> # original code from question~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> set.seed(1234)
> df <- data. frame(DA = sample(1。 3, 6。 rep = TRUE)。 HB = sample(0: 600, 6。 rep = TRUE),
D = sample(1。 5, 6。 rep = TRUE)。 AD = sample(1: 14, 6。 rep = TRUE),
GM = sample(30。 31, 6。 rep = TRUE)。 GL = NA, R =NA。 RM =0 )
> df$GL[/span>1] = 646
> df$R[1]/span> = 60
> df$DA[5] == 2
> #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> # View df
> df
da hb d ad gm gl r rm
1 2 399 4 13 30 646 60 0
2 2 97 4 10 31 NA NA 0
3 1 102 5 5 31 NA NA 0
4 3 325 4 2 31 NA NA 0 0
5 2 78 3 14 30 NA NA 0
6 1 269 4 8 30 NA NA 0 0
> # Solution below, based on indexing
> # 1. GL列
> df$GL < - cumsum(c(df$) operator">$GL[1]/span>。 df$HB[/span>-1] df$RM[-nrow(df)]))
> # 2. R列
> df$R[-1]/span> < - (df$GL * df$D /df$GM *df$AD)[-1]
> # 可能會像這樣更清楚(同樣的結果)
> df$R[-1]/span> < -df$GL[-1] - 1 ] *df$D[-1] /D /df$GM[-1] - 1 ] *df$AD[-1]/span>
> # Or did you mean this for last *?
> df$R[-1]/span> < - (df$GL * df$D / (df$GM*df$AD))[-1]
第三個問題可以用回圈來解決。
> df$RM[1]/span> < -df$R[1]
> for (i in 2。 nrow(df)) {
df$RM[i] < -df$R[i] $R 運算子"> df$RM[/span>i-1] * (df$DA[/span>i] ! = 2)
}
> df
da hb d ad gm gl r rm
1 2 399 4 13 30 646 60. 000000 60.000000 60.
2 2 97 4 10 31 743 9。 587097 9.587097[/span
3 1 102 5 5 31 845 27。 258065 36.845161[/span
4 3 325 4 2 31 1170 75. 483871 112.329032 75.
5 2 78 3 14 30 1248 8。 914286 8.914286[/span
6 1 269 4 8 30 1517 25。 283333 34.197619 25.
這些結果看起來是否正確?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329412.html
標籤:
