考虑以下数据:
Var1 Var2 Target
A 0 no
A 250 no
A 0 si
A 0 si
B 0 no
B 0 no
B 0 no
B 250 no
C 0 no
C 250 no
C 0 si
C 250 no
并查看名为Target的变量。我需要用相同的值重现它。
获得" si"的条件或"不"如下:
对于相同级别的Var1(例如A),如果Var2 = 250并且nexts = 0则则Target = si
我制作了这段代码:
df$Target <- NA
for(i in unique(df$Var1)){
subset.data.frame(df, Var1==i)
for(n in 1: length(df$Var1))
df$Target <-
ifelse(df$Var2[n]==250 && df$Var2[n+1]==0 && df$Var1[n+1]==df$Var1[n], "si", "no"))
但是只有当下一个Var2 = 0时,我才得到Target = si。 相反,如上面的数据集中所述,在250之后Var2 = 0的所有观测都必须是Target = si。
你能帮我解决这个问题吗?
谢谢你, 安德烈
答案 0 :(得分:1)
library(dplyr)
df %>%
group_by(Var1) %>%
mutate(Target = ifelse(cumsum(lag(Var2, default=0) == 250) > 0
& Var2 == 0, 'si', 'no'))
# A tibble: 12 x 3
# Groups: Var1 [3]
Var1 Var2 Target
<fctr> <int> <chr>
1 A 0 no
2 A 250 no
3 A 0 si
4 A 0 si
5 B 0 no
6 B 0 no
7 B 0 no
8 B 250 no
9 C 0 no
10 C 250 no
11 C 0 si
12 C 250 no
我们使用dplyr
按df
级别对Var1
进行分组,然后针对每个组cumsum(lag(Var2, default=0) == 250) > 0
告诉我们该组中的每一行 any < / em>以前对该组Var2
的观察结果为250,而Var2 == 0
告诉我们当前Var2
的观察结果是否为0.如果这两个条件都是TRUE
,我们代码Target
as&#34; si&#34;,否则我们将其编码为&#34; no&#34;
我为df
开始的数据是
structure(list(Var1 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"),
Var2 = c(0L, 250L, 0L, 0L, 0L, 0L, 0L, 250L, 0L, 250L, 0L,
250L)), .Names = c("Var1", "Var2"), row.names = c(NA, -12L
), class = "data.frame")
arkun解决方案的输出如下所示,您可以确定哪种方法更适合您的问题。
# A tibble: 12 x 3
# Groups: Var1 [3]
Var1 Var2 Target
<fctr> <int> <chr>
1 A 0 si
2 A 250 no
3 A 0 no
4 A 0 no
5 B 0 no
6 B 0 no
7 B 0 si
8 B 250 no
9 C 0 si
10 C 250 no
11 C 0 si
12 C 250 no
答案 1 :(得分:0)
我们可以使用dplyr
library(dplyr)
df1 %>%
group_by(Var1) %>%
mutate(Target = replace(Target, Var2==0 & lead(Var2, default = Var2[n()])==250, 'si'))