我有一个虚拟变量,用作数据集中许多条件的标志。 我无法弄清楚如何编写一个功能来标记标志假定“最终切换”的位置,该值在其余数据帧中不会改变。 >在下面的示例中,第七次观察之后的所有内容均为“ 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
我尝试创建第二个标志来标记每个开关并返回“最终”开关/标志变量,但是在我的整个数据帧中,这可能效率很低。任何建议都值得欢迎和赞赏。
答案 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