R:基于频繁观察和其他变量编码变量

时间:2017-11-24 11:56:29

标签: r for-loop

考虑以下数据:

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。

你能帮我解决这个问题吗?

谢谢你, 安德烈

2 个答案:

答案 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

解释

我们使用dplyrdf级别对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")

与akrun解决方案的比较

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'))