首页 > 解决方案 > 如何使用 r 中的 if 条件基于其他列创建新列

问题描述

无法找到一种方法来根据列中事件组的 if 条件生成新列。

名为“BF”的列表示流列的 (i-3),并且对于每个“事件”组将是相同的 BF。例如,在第 5 行中,“BF”的值为 39,这是事件列中所有“2”的流列(第 2 行的流)的前第 3 个值。问题是 BF[i] 不能大于 flow[i]。如果 BF[i] 大于 flow[i],则 BF 应该是流的 (i-4) 或 (i-5) 或 (1-6)...,直到 BF[i] 相等或小于 flow[i]。例如,在第 10 行中,“BF”列的值大于“flow”列的值,因此,第 10 行中 BF_1(我要创建的列)的值是 37,表示最接近的较低流量的值,在本例中为 flow[i-6]。

例如,我们有以下数据框:

flow<- c(40, 39, 38, 37, 50, 49, 46, 44, 43, 45, 40, 30, 80, 75, 50, 55, 53, 51, 49, 100)
event<- c(1,1,1,1,2,2,2,2,2,3,3,3,4,4,4,5,5,5,5,6)
BF<- c(NA, NA, NA, NA, 39, 39, 39, 39, 39, 46, 46, 46, 45, 45, 45, 80, 80, 80, 80, 53)
a<- data.frame(flow, event, BF)

这是我正在寻找的愿望输出。我想创建 BF_1 列。

   flow event BF  BF_1
1    40   1   NA   NA
2    39   1   NA   NA
3    38   1   NA   NA
4    37   1   NA   NA
5    50   2   39   39
6    49   2   39   39
7    46   2   39   39
8    44   2   39   39
9    43   2   39   39
10   45   3   46   37
11   40   3   46   37
12   30   3   46   37
13   80   4   45   45
14   75   4   45   45
15   50   4   45   45
16   55   5   80   30
17   53   5   80   30
18   51   5   80   30
19   49   5   80   30
20  100   6   53   53

有没有可能生成列 BF_1 的方法?请让我知道任何想法。我正在使用 for 循环并使用 if 条件,但我无法为整个事件列组保存 BF 值。

标签: rfor-loopif-statementcol

解决方案


编码有点低效,可以使用 dplyr 等,但它会完成工作并匹配BF_1给定的列

flow <- c(40, 39, 38, 37, 50, 49, 46, 44, 43, 45, 40, 30, 80, 75, 50, 55, 53, 51, 49, 100)
event <- c(1,1,1,1,2,2,2,2,2,3,3,3,4,4,4,5,5,5,5,6)
BF <- c(NA, NA, NA, NA, 39, 39, 39, 39, 39, 46, 46, 46, 45, 45, 45, 80, 80, 80, 80, 53)
a <- data.frame(flow, event, BF)

a$BF_1 <- NA #default to NA first

for(i in 1:length(unique(a$event))){

  if(is.na(a[a$event == i, "BF"][1])) next

  if(a[a$event == i, "BF"][1] < a[a$event == i, "flow"][1]) a[a$event == i, "BF_1"] <- a[a$event == i, "BF"][1]

  if(a[a$event == i, "BF"][1] > a[a$event == i, "flow"][1]) {
    head <- min(which(a$event==i))-6 
    if (min(head-6) < 0) head <- 1 #making sure it doesn't overflow to row 0
    a[a$event == i, "BF_1"] <- min( a[  head:min(which(a$event==i)), "flow"] ) #fill the min of the subset flow column given position
  }

}

a

推荐阅读