问题描述
我在尝试清理 R 中的数据框时遇到问题,并且在任何地方都找不到答案。
df <- data.frame(ID = c(1,1,2,3,3),A = c("yes","yes",NA,"no",NA),B = c("yes",time = c(0,1))
df
ID A B time
1 1 yes yes 0
2 1 yes no 1
3 1 <NA> <NA> 0
4 1 <NA> <NA> 1
5 2 yes no 0
6 2 no no 1
7 2 <NA> <NA> 0
8 2 <NA> <NA> 1
9 3 no no 0
10 3 <NA> <NA> 0
11 3 <NA> <NA> 1
我想要的是这个:
df
ID A B time
1 1 yes yes 0
2 1 yes no 1
5 2 yes no 0
6 2 no no 1
9 3 no no 0
11 3 <NA> <NA> 1
这样每个 ID 在时间 0 和 1 出现两次。我不能使用像 df[complete.cases(df[,2]),]
这样的东西,因为这会删除第 10 行,而 unique(df)
或 duplicated()
只会使数据框基本保持不变。
有什么想法吗?
解决方法
我们可以使用 match
:
library(dplyr)
df %>% group_by(ID) %>% slice(match(c(0,1),time))
# ID A B time
# <int> <chr> <chr> <int>
#1 1 yes yes 0
#2 1 yes no 1
#3 2 yes no 0
#4 2 no no 1
#5 3 no no 0
#6 3 <NA> <NA> 1
数据
df <- structure(list(ID = c(1L,1L,2L,3L,3L),A = c("yes","yes","<NA>","no","<NA>"),B = c("yes",time = c(0L,0L,1L)),class = "data.frame",row.names = c(NA,-11L))
,
df[!duplicated(paste(df$ID,df$time)),]
# ID A B time
# 1 1 yes yes 0
# 2 1 yes no 1
# 5 2 yes no 0
# 6 2 no no 1
# 9 3 no no 0
# 11 3 <NA> <NA> 1
可重现的数据
df <- data.frame(
ID = c(1,1,2,3,3),A = c("yes",NA,NA),B = c("yes",time = c(0,1)
)