R 如何使用其他列中的信息创建列
无法创建我想要的列。它包括为事件列的每个新值使用流列的前三个值 我试图通过使用for循环来解决这个问题,但无法完全复制我想要的内容。我很近,但不在那里 为了重新创建示例,我生成了以下数据帧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<-
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值