R中的虚拟变量“开关点”

时间:2019-01-31 17:19:21

标签: r dataframe dummy-variable

我有一个虚拟变量,用作数据集中许多条件的标志。 我无法弄清楚如何编写一个功能来标记标志假定“最终切换”的位置,该值在其余数据帧中不会改变。 >在下面的示例中,第七次观察之后的所有内容均为“ y”。

  dplyr::tibble(
    observation = c(seq(1,10)),
    crop = c(runif(3,1,25),
              runif(1,50,100),
              runif(2,1,10),
              runif(4,50,100)),
    flag = c(rep("n", 3),
             rep("y", 1),
             rep("n", 2),
             rep("y", 4)))

哪种产量:

   observation  crop flag 
         <int> <dbl> <chr>
 1           1 13.3  n    
 2           2  4.34 n    
 3           3 17.1  n    
 4           4 80.5  y    
 5           5  9.62 n    
 6           6  8.39 n    
 7           7 92.6  y    
 8           8 74.1  y    
 9           9 95.3  y    
10          10 69.9  y    

我尝试创建第二个标志来标记每个开关并返回“最终”开关/标志变量,但是在我的整个数据帧中,这可能效率很低。任何建议都值得欢迎和赞赏。

3 个答案:

答案 0 :(得分:2)

执行此操作的一种方法可能是创建一个标志,该标志可累计发生标志切换的次数。

cumsum_na <- function(x){
  x[which(is.na(x))] <- 0
  return(cumsum(x))
}

df <- dplyr::tibble(
    observation = c(seq(1,10)),
    crop = c(runif(3,1,25),
              runif(1,50,100),
              runif(2,1,10),
              runif(4,50,100)),
    flag = c(rep("n", 3),
             rep("y", 1),
             rep("n", 2),
             rep("y", 4)))

df %>%
  mutate(flag2 = ifelse(flag != lag(flag), 1, 0) %>%
               cumsum_na)

# A tibble: 10 x 4
   observation  crop flag  flag2
         <int> <dbl> <chr> <dbl>
 1           1 12.1  n         0
 2           2 11.2  n         0
 3           3  4.66 n         0
 4           4 61.6  y         1
 5           5  6.00 n         2
 6           6  9.54 n         2
 7           7 67.6  y         3
 8           8 86.7  y         3
 9           9 91.6  y         3
10          10 84.5  y         3

然后,您可以使用flag2列执行任何操作(例如,对最大值进行过滤,采用第一行,这将使您第一次出现恒定状态)。

答案 1 :(得分:0)

我首先计算所有的“ n”,当最后一个“ n”满足时,我得到下一个obs的索引。

i=0
j=1
while (i<table(df$flag)["n"]) {
  if (as.character(df[j,3]) =="n" ) {
    i=i+1
    j=j+1
  } else j=j+1
}

您正在寻找j

答案 2 :(得分:0)

我们可以利用rleid中的data.table

library(data.table)
setDT(df)[, flag2 := rleid(flag)]
df
#    observation      crop flag flag2
# 1:           1 21.472985    n     1
# 2:           2 21.563190    n     1
# 3:           3  1.393184    n     1
# 4:           4 88.422562    y     2
# 5:           5  6.383627    n     3
# 6:           6  8.484030    n     3
# 7:           7 86.998953    y     4
# 8:           8 62.220592    y     4
# 9:           9 93.141503    y     4
#10:          10 96.006885    y     4