我有一個包含兩行的資料框,表示乘客上車和下車的乘客:
A B C D E F
In 9 10 6 9 14 10
Out 0 1 2 3 4 3
我想做一個計算,將產生兩行資訊,其中第一行是到達 A/B/C 站等時在車上的乘客,第 2 行是有乘客的人數在那個車站下車。
第1行的數字應該與第2行的前一個數字相同,例如B站的第2行是`9(上一站留在公交車上的人數) BIn(人數在車站上車的人數)- BOut(在車站下車的人數)。
最終結果應如下所示:
A B C D E F
In 9 10 6 9 14 10
Out 0 1 2 3 4 3
1 0 9 18 22 28 38
2 9 18 22 28 38 45
我將如何遍歷資料框以便獲得這些數字?是否需要 for 回圈,或者是否有更簡單的方法來完成此計算?
uj5u.com熱心網友回復:
首先,我認為將這些作為列而不是行更有意義。這樣你就可以利用 R 中的矢量化操作。
library(data.table)
df <- suppressWarnings(fread('
A B C D E F
In 9 10 6 9 14 10
Out 0 1 2 3 4 3'))
setDT(df) # only required if not starting with a data.table
df
#> V1 A B C D E F
#> <char> <int> <int> <int> <int> <int> <int>
#> 1: In 9 10 6 9 14 10
#> 2: Out 0 1 2 3 4 3
df_tp <- transpose(df, make.names = 'V1', keep.names = 'station')
df_tp
#> station In Out
#> <char> <int> <int>
#> 1: A 9 0
#> 2: B 10 1
#> 3: C 6 2
#> 4: D 9 3
#> 5: E 14 4
#> 6: F 10 3
現在您的最后一行是 In 的累積總和減去 Out 的累積總和。另一個只是它的滯后版本。
df_tp[, net := cumsum(In) - cumsum(Out)]
df_tp[, lagged_net := shift(net, fill = 0)]
df_tp
#> station In Out net lagged_net
#> <char> <int> <int> <int> <int>
#> 1: A 9 0 9 0
#> 2: B 10 1 18 9
#> 3: C 6 2 22 18
#> 4: D 9 3 28 22
#> 5: E 14 4 38 28
#> 6: F 10 3 45 38
由reprex 包(v2.0.1)于 2021 年 12 月 7 日創建
uj5u.com熱心網友回復:
我認為您應該接受@IceCreamToucan 的建議和回答,但如果您出于特定原因想保持相同的結構,這個不雅的、蠻力for回圈將產生您想要的輸出:
df <- data.frame(A = c(9,0),
B = c(10,1),
C = c(6,2),
D = c(9,3),
E = c(14, 4),
F = c(10, 3))
for (i in 1:ncol(df)){
if (i == 1){df[3:4,1] <- c(0,df[1,1])}
else{
df[3,i] <- df[4,i-1]
df[4,i] <- sum(df[4,i-1], df[1,i]) - df[2,i]
}
}
df
# A B C D E F
#1 9 10 6 9 14 10
#2 0 1 2 3 4 3
#3 0 9 18 22 28 38
#4 9 18 22 28 38 45
uj5u.com熱心網友回復:
或者有一種tidyverse方法來做到這一點:
以您共享的格式加載資料:
library(tidyverse)
df <- data.frame(A = c(9,0),
B = c(10,1),
C = c(6,2),
D = c(9,3),
E = c(14,4),
F = c(10,3))
> df
A B C D E F
1 9 10 6 9 14 10
2 0 1 2 3 4 3
轉換為長格式:
df <- as_tibble(t(df), rownames = "row_names") %>%
rename('In' = V1, 'Out' = V2)
> df
# A tibble: 6 x 3
row_names In Out
<chr> <dbl> <dbl>
1 A 9 0
2 B 10 1
3 C 6 2
4 D 9 3
5 E 14 4
6 F 10 3
添加您想要的變數cumsum和lag:
df %>% mutate(net = cumsum(In) - cumsum(Out),
lag = replace_na(lag(net), 0))
> df
# A tibble: 6 x 5
row_names In Out net lag
<chr> <dbl> <dbl> <dbl> <dbl>
1 A 9 0 9 0
2 B 10 1 18 9
3 C 6 2 22 18
4 D 9 3 28 22
5 E 14 4 38 28
6 F 10 3 45 38
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376274.html
