R 如何使用其他列中的信息创建列

R 如何使用其他列中的信息创建列,r,for-loop,R,For Loop,无法创建我想要的列。它包括为事件列的每个新值使用流列的前三个值 我试图通过使用for循环来解决这个问题,但无法完全复制我想要的内容。我很近,但不在那里 为了重新创建示例,我生成了以下数据帧 flow<- c(40, 39, 38, 37, 50, 49, 46, 44, 60, 55, 40, 70, 80, 75, 90, 88, 86, 100, 120, 118) event<- c(1,1,1,1,2,2,2,2,3,3,3,4,5,5,6,6,6,7,8,8) a<-

无法创建我想要的列。它包括为事件列的每个新值使用流列的前三个值

我试图通过使用for循环来解决这个问题,但无法完全复制我想要的内容。我很近,但不在那里

为了重新创建示例,我生成了以下数据帧

flow<- c(40, 39, 38, 37, 50, 49, 46, 44, 60, 55, 40, 70, 80, 75, 90, 88, 86, 100, 120, 118)
event<- c(1,1,1,1,2,2,2,2,3,3,3,4,5,5,6,6,6,7,8,8)
a<- data.frame(flow, event)

for (j in seq(1, length(a$event))) {
  if (a$event[j] <= 1){ 
   a$BF[a$event==j]<- NA}                  
else{ 
 if (a$event[j] == a$event[j-1]){
  a$BF[a$event==j]<- a$flow[j-3]
  } else{
  a$BF[j]<- a$flow[j-3] }
 }
}

I expected to generate a column called "BF" to be like this:
    flow event BF
1    40     1  NA
2    39     1  NA
3    38     1  NA
4    37     1  NA
5    50     2  39
6    49     2  39
7    46     2  39
8    44     2  39
9    60     3  49
10   55     3  49
11   40     3  49
12   70     4  60
13   80     5  55
14   75     5  55
15   90     6  70
16   88     6  70
17   86     6  70
18  100     7  90
19  120     8  88
20  118     8  88

我在前面的代码中得到的错误是没有正确复制与事件列匹配的值。它应该如表所示。

使用tidyverse获得输出的另一种方法。这会把你的问题分成两部分。可能还有更简洁的说法:

library(tidyverse)
critical_info <- a %>% 
  mutate(previous = lag(flow, 3)) %>% #find the previous flow number for each
  group_by(event) %>% 
  mutate(subevent = row_number()) %>% #to knew each subevent within an event
  filter(subevent == 1) %>% #filter out unimportant rows
  rename(BF = previous) %>% #rename the column
  select(event, BF) # get the right stuff

a %>% 
  left_join(critical_info, by ="event")

更整洁的解决方案将是:

library(dplyr)
a %>% 
 mutate(BF = ifelse(event<=1,NA,row_number()-3)) %>% 
 group_by(event) %>%
 mutate(BF = BF[1]) %>%
 ungroup() %>%
 mutate(BF = a[BF,]$flow)

# A tibble: 20 x 3
    flow event    BF
   <dbl> <dbl> <dbl>
 1    40     1    NA
 2    39     1    NA
 3    38     1    NA
 4    37     1    NA
 5    50     2    39
 6    49     2    39
 7    46     2    39
 8    44     2    39
 9    60     3    49
10    55     3    49
11    40     3    49
12    70     4    60
13    80     5    55
14    75     5    55
15    90     6    70
16    88     6    70
17    86     6    70
18   100     7    90
19   120     8    88
20   118     8    88

这逻辑有点难理解。也许更清楚你是如何获得新价值的。例如,第13行的值来自哪里?不应该是70吗?嗨,很抱歉不清楚,bf的第13行的值来自第10行的流量值的前3个值,依此类推所有bf列。另一个例子是第5行。该行的bf值是流量行2=39的前三个值。当事件列的数量发生变化时,bf列的新值应开始,该值将成为流量列的前三个行的值。事件列的BF值应相同,直到事件列发生变化,然后我们通过再次查找流列的前3行来搜索新的BF值