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