Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 创建一个虚拟变量,指示之前是否观察到值_R_Dplyr - Fatal编程技术网

R 创建一个虚拟变量,指示之前是否观察到值

R 创建一个虚拟变量,指示之前是否观察到值,r,dplyr,R,Dplyr,我有一个巨大的数据集,想创建一个二进制虚拟变量,指示之前是否观察到一个值。这是示例数据集 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)

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

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)
对于每一组,我想知道之前是否观察到
项目
。我可以使用
for loop
执行,但数据太大,无法执行。

使用复制:

基数:

或dplyr:

库(dplyr)
x%>%
分组依据(id)%>%
mutate(flag=as.integer(重复的(项)))
##一个tibble:9x4
##组别:id[3]
#id时间项标志
#     
#11110
#21200
#3 A 3 13 0
#4b1110
#5 B 2 11 1
#6B3130
#7 C 122 0
#8C2110
#9 C 3 22 1

我们可以按“id”、“item”进行分组,创建一个带有
行号()的逻辑向量,并将其强制为二进制(
+

-输出

# 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
#一个tible:9 x 4
#分组:id,项目[7]
#id时间项标志
#     
#11110
#21200
#3 A 3 13 0
#4b1110
#5 B 2 11 1
#6B3130
#7 C 122 0
#8C2110
#9 C 3 22 1

一种基于R的解决方案,它使用:
ave
duplicated

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

df$observed\u b4 id时间项observed\u b4
#>11110
#>21200
#>3 A 3 13 0
#>4b1110
#>5 B 2 11 1
#>6B3130
#>7 C 122 0
#>8C2110
#>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
df$observed\u b4 id时间项observed\u b4
#>11NA
#>21200
#>3 A 3 13 0
#>4b111na
#>5 B 2 11 1
#>6B3130
#>7C122NA
#>8C2110
#>9 C 3 22 1

可能会看到重复的
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
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