我有一个数据框架,其中有两行,表示乘客装载到公共汽车上,乘客离开公共汽车:
A B C D E F
In 9 10 6 9 14 10
Out 0 1 2 3 4 3我想做一个计算,得到两行信息,第一排是当巴士到达A/B/C/etc站的乘客,第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循环,或者是否有更简单的方法来完成此计算?
发布于 2021-12-07 20:04:03
我认为您应该采纳@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发布于 2021-12-07 20:24:17
或者是用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 38https://stackoverflow.com/questions/70266094
复制相似问题