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

时间:2019-07-13 20:43:05

标签: 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<- 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

我在前面的代码中获得的错误是没有正确复制与“事件”列匹配的值。 (应该与表格中显示的一样)。

2 个答案:

答案 0 :(得分:1)

更多Tidy-er解决方案将是:

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

答案 1 :(得分:0)

使用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")