【问题标题】:Create a dummy variable indicating whether a value is observed before创建一个虚拟变量,指示之前是否观察到一个值
【发布时间】:2020-10-28 21:11:57
【问题描述】:

我有一个庞大的数据集,想创建一个二进制虚拟变量来指示之前是否观察到某个值。这是样本数据集。

data.frame(
  id = c(rep("A",3),rep("B",3),rep("C",3)),
  time = rep(seq(1:3),3),
  item = c(11,12,13,11,11,13,22,11,22))

从数据集中,这里是所需的列,

observed_b4 = c(NA,0,0,NA,1,0,NA,0,1)

对于每个组,我想知道之前是否观察到item。我可以用for-loop 做到这一点,但数据量太大而无法做到。

【问题讨论】:

  • 也许见duplicated

标签: r dplyr


【解决方案1】:

使用复制

基础

cbind(x, flag = as.integer(duplicated(paste(x$id, x$item))))
#   id time item flag
# 1  A    1   11    0
# 2  A    2   12    0
# 3  A    3   13    0
# 4  B    1   11    0
# 5  B    2   11    1
# 6  B    3   13    0
# 7  C    1   22    0
# 8  C    2   11    0
# 9  C    3   22    1

dplyr

library(dplyr)

x %>% 
  group_by(id) %>% 
  mutate(flag = as.integer(duplicated(item)))
## A tibble: 9 x 4
## Groups:   id [3]
#  id     time  item  flag
#  <chr> <int> <dbl> <int>
#1 A         1    11     0
#2 A         2    12     0
#3 A         3    13     0
#4 B         1    11     0
#5 B         2    11     1
#6 B         3    13     0
#7 C         1    22     0
#8 C         2    11     0
#9 C         3    22     1

【讨论】:

    【解决方案2】:

    基于 R 的解决方案使用:aveduplicated

    ave 允许您为df$id 创建的每个组在df$item 上应用一个函数。 duplicated 检查项目是否已显示。 ave 自动返回一个数值向量(输入向量的名称类)。

    df$observed_b4 <- ave(df$item, df$id, FUN = duplicated)
    df
    #>   id time item observed_b4
    #> 1  A    1   11           0
    #> 2  A    2   12           0
    #> 3  A    3   13           0
    #> 4  B    1   11           0
    #> 5  B    2   11           1
    #> 6  B    3   13           0
    #> 7  C    1   22           0
    #> 8  C    2   11           0
    #> 9  C    3   22           1
    

    但是,要准确获得您正在寻找的内容,您可以使用以下方法:

    df$observed_b4 <- ave(df$item, df$id, FUN = function(x) replace(duplicated(x),1,NA))
    df
    #>   id time item observed_b4
    #> 1  A    1   11          NA
    #> 2  A    2   12           0
    #> 3  A    3   13           0
    #> 4  B    1   11          NA
    #> 5  B    2   11           1
    #> 6  B    3   13           0
    #> 7  C    1   22          NA
    #> 8  C    2   11           0
    #> 9  C    3   22           1
    

    【讨论】:

      【解决方案3】:

      我们可以按 'id'、'item' 分组,使用 row_number() 创建一个逻辑向量并将其强制转换为二进制 (+)

      library(dplyr)
      df1 %>% 
           group_by(id, item) %>%
           mutate(flag = +(row_number() != 1))
      

      -输出

      # A tibble: 9 x 4
      # Groups:   id, item [7]
      #  id     time  item  flag
      #  <chr> <int> <dbl> <int>
      #1 A         1    11     0
      #2 A         2    12     0
      #3 A         3    13     0
      #4 B         1    11     0
      #5 B         2    11     1
      #6 B         3    13     0
      #7 C         1    22     0
      #8 C         2    11     0
      #9 C         3    22     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 2022-04-04
        • 1970-01-01
        • 2020-08-23
        • 2020-09-11
        • 1970-01-01
        • 2012-05-24
        相关资源
        最近更新 更多