2015-05-06 33 views
0

我有这两个表,我从一个更大的表子集的意见:R,分析不合并

table1 <- parent_table[parent_table$diag %in% c('a', 'b', 'c'), parent_table$patient_id] 

table2 <- parent_table[parent_table$med %in% c('d', 'e', 'f'), parent_table$patient_id] 

我然后合并这两个表,就patient_id哪些病人接受了药物治疗的诊断。

merge1 <- merge(table1, table2, by="patient_id", all = TRUE) 

我现在想对那些谁没有接受抗生素,即那些被包含在谁做table1分析,但不merge1

+5

欢迎来到Stack Overflow!请提供[可重现的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。如果没有可重复的例子,我只能猜测'setdiff(table1 $ patient_id,table2 $ patient_id)'可能会诀窍。 – Jota

+0

与Frank相同:caveat merge(df1,df2,all = T)。添加df1 $ label =“label1”和df2 $ label =“label2”是有帮助的。 – Henk

+0

你的意思是包含在'table1'而不是'table2'中的病人?您不在'merge1'中指定,这是没有意义的,因为与'all = TRUE'合并将包含'table1'中的所有患者(可能更多)。 –

回答

4

您可以使用merge1<- merge(table1, table2, by="patient_id", all = TRUE),然后子集获取药物为空的记录。即

nomeds <- subset(merge1, is.na(medication)) 

然后,它会给你一个新的数据集,nomeds,你可以做任何你喜欢的分析。

我不知道,如果这是你的意思 - 这将是更容易帮助,如果你给一个虚拟数据集:)

0

重复的例子,因为你只是简单的子集划分table1给患者中不存在table2,你可以做一个简单的子集操作,而不是合并:

nomeds <- table1[!(table1$patient_id %in% table2$patient_id), ] 

对于table1每一行,这个检查patient_id是否在patient_id期从table2列表。如果不是,则保留该行,否则将其排除。

1

如果你愿意去基地R以外,dplyr有一个伟大的运营商为此:dplyr::anti_join(a,b,by="x1")返回一个不在b中的所有行,所以,merge1=anti_join(table1,table2,by="patientID"会给你想要的。

重复的例子:

#Table of people and how much they make 
x = data.frame(id=c(1,2,3,4,5),Name=c("Bob","Betty","Carl","Catherine","Dilbert"),Salary=c(65000,78000,27000,36000,172000)) 
> x 
    id  Name Salary 
1 1  Bob 65000 
2 2  Betty 78000 
3 3  Carl 27000 
4 4 Catherine 36000 
5 5 Dilbert 172000  

#Table of Women 
y = data.frame(id=c(2,4),Name=c("Betty","Catherine"),Gender="Female" 
> y 
    id  Name Gender 
1 2  Betty Female 
2 4 Catherine Female 

#Table of Men 
> anti_join(x,y,by="id") 
    id Name Salary 
1 3 Carl 27000 
2 1  Bob 65000 
3 5 Dilbert 172000 
+0

您是不是指'merge1 < - dplyr :: anti_join(table1,table2,by =“patient_id”)?现在你正在将'table1'和'merge1'合并。 –

+0

@AlexA。 OP说他有table1,table2,将它们合并,然后想要table1中不在合并表中的行。那将会是我输入的内容。如果真正的目标是获取不在table2中的table1中的行,那么您的代码更好。我会编辑答案。 – Mark

+1

问题是,与'all = TRUE'合并仍然会给你'table1'中的同一个集合或一个超集。因此,为了让没有接受特定药物治疗的患者,您需要反加入,以便将'table2'中的患者从'table1'中排除,就像您在编辑中所做的那样。 OP最后一句中的merge1可能是一个错字,因为否则它就没有意义了。 –

0

如果merge和使用ARG all = TRUE,为每一个被确诊但没有收到MED patient_id - 你会得到一个NA值。这应该回答你的问题。我用编码编辑了你的文章。

parent_table <- data.frame(patient_id = c(1,2,3,4,5,6, 7, 8), 
          diag = c("a", "b", "d", "d", "e", "c", "f", "e"), 
          med = c("c", "d", "a", "e", "d", "f", "a", "b")) 

table1 <- parent_table[parent_table$diag %in% c('a', 'b', 'c'), c("patient_id", "diag")] 
table2 <- parent_table[parent_table$med %in% c('d', 'e', 'f'), c("patient_id", "med")] 

merge1 <- merge(table1, table2, by="patient_id", all = TRUE) 

> merge1 
    patient_id diag med 
1   1 a <NA> 
2   2 b d 
3   4 <NA> e 
4   5 <NA> d 
5   6 c f 
+0

这完全没有回答问题,尤其是在您编辑代码以仅从每个表中选择患者ID之后。那么如果你与'all = TRUE'合并,你就不会有任何“NA”,因为你只处理一列。另外你的编辑真的不应该被批准 - 它作为一个编辑没有任何意义。代码不应该在其他人的帖子中“纠正”。相反,发表评论建议的代码,以确保它符合OP的意图。 –

+0

让我重新检查一下。 – vagabond

+0

好吧,当从父表中进行子集化时,将添加诊断列和中值列,然后合并到患者ID解决它?我想我只选择了患者ID列。 – vagabond