r-创建一个伪变量,指示之前是否观察到某个值



我有一个巨大的数据集,想创建一个二进制伪变量,指示以前是否观察到值。这是示例数据集。

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来做,但数据太大了。

使用复制

基础

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

一个以R为基的解决方案,使用:aveduplicated

ave允许您在df$item上为df$id生成的每个组应用一个函数。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

我们可以按"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

相关内容

最新更新