首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代数据帧以进行计算

迭代数据帧以进行计算
EN

Stack Overflow用户
提问于 2021-12-07 19:44:18
回答 2查看 155关注 0票数 1

我有一个数据框架,其中有两行,表示乘客装载到公共汽车上,乘客离开公共汽车:

代码语言:javascript
复制
    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 (在车站下车的人数)。

最终结果应该如下所示:

代码语言:javascript
复制
    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循环,或者是否有更简单的方法来完成此计算?

EN

回答 2

Stack Overflow用户

发布于 2021-12-07 20:04:03

我认为您应该采纳@IceCreamToucan的建议和答案,但是如果您出于特定原因想要保持相同的结构,这个不雅的、蛮力的for循环将产生您想要的输出:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2021-12-07 20:24:17

或者是用tidyverse的方式来做:

以共享的格式加载数据:

代码语言:javascript
复制
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

转换为长格式:

代码语言:javascript
复制
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

使用cumsumlag添加您想要的变量

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70266094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档