(没有经验的编码员 - 对不起,如果简单的问题!)
我有两个数据框x
和y
:
x
:包含一列唯一的数字ID
y
:包含一列非唯一数字ID和一列可变数字代码(诊断医疗代码)
y
中的所有ID都在x
中(并且在任一数据框中都没有额外的ID),但y
中的ID可以重复多行。 y
中的每个ID在相邻列中都有一个代码。这些代码可以在ID内和ID之间变化,每个ID可以有多个相同的代码(即,可以有多个相同的ID代码对)。
我想要做什么:对于x
中的每个ID(或y
中唯一的ID列表),选择y
中具有匹配ID的行并将其删除如果第二列中的代码仅针对该特定ID发生一次,则从y
开始。 (或者,对于x
中的每个ID,选择y
中具有多次出现代码的匹配行,并使用这些ID代码对进行新的数据框。)
我可能(可能?)我根本不需要使用x
,因为y
和x
中的ID完全相同,但只是在y
中重复。
我尝试使用for循环来制作一个新的df,但它似乎需要永远而且永远......
df <- data.frame()
for (a in x$id){
r <- subset(y, id==a)
s <- count(r, code) %>% subset(n > 1)
t <- subset(r, code %in% s)
df <- rbind(df, t)
}
(我确定这是非常低效的,请不要取笑我。还要从记忆中写下这个,希望它能运行。)
示例数据框:
y
id code
12345 1092
12345 1092
12345 7448
12345 2274
74839 6117
74839 8337
90029 1092
90029 1092
90029 1092
90029 5521
90029 5521
90029 9338
x
id
12345
74839
90029
输出最好是:
id code
12345 1092
12345 1092
90029 1092
90029 1092
90029 1092
90029 5521
90029 5521
有一个更好的方法吗?谢谢你的帮助。
答案 0 :(得分:1)
一种方式如下。首先,首先使用x中的id在y中对观测值进行子集化。然后,使用id和code对数据进行分组,并删除任何只有一个观察的组。
library(dplyr)
filter(y, id %in% x$id) %>%
group_by(id, code) %>%
filter(n() != 1) %>%
ungroup
另一种方式如下。
filter(y, id %in% x$id) %>%
group_by(id) %>%
filter(!(!duplicated(code) & !duplicated(code, fromLast = TRUE)))
# id code
# <int> <int>
#1 12345 1092
#2 12345 1092
#3 90029 1092
#4 90029 1092
#5 90029 1092
#6 90029 5521
#7 90029 5521