首页 > 解决方案 > 如何匹配模式不同的三列?

问题描述

我有与以下类似的数据(但更大):

example <- rbind(data.frame(species = "A", trait1 = "yes", trait2 = NA),      
     data.frame(species = "A", trait1 = NA, trait2 = "yes"), 
     data.frame(species = "B", trait1 = NA, trait2 = "no"), 
     data.frame(species = "B", trait1 = "yes", trait2 = NA), 
     data.frame(species = "B", trait1 = "no", trait2 = NA),
     data.frame(species = "B", trait1 = "no", trait2 = NA), 
     data.frame(species = "C", trait1 = NA, trait2 = "no"), 
     data.frame(species = "C", trait1 = "no", trait2 = NA), 
     data.frame(species = "D", trait1 = "yes", trait2 = NA), 
     data.frame(species = "D", trait1 = NA, trait2 = "yes"), 
     data.frame(species = "E", trait1 = NA, trait2 = "no"), 
     data.frame(species = "E", trait1 = "no", trait2 = NA), 
     data.frame(species = "E", trait1 = "no", trait2 = NA))

在这里,trait2 是一个固定值(1 个物种的 1 个值),但 trait1 在物种内是可变的。对于每个性状值,物种的数据来自不同的行。在数据管理之后,我想保持 trait1 中存在的可变性,这似乎使过程有点复杂。

最后,我想将 R 中的这个数据框转换为以下数据框:

ex.res <- rbind(data.frame(species = "A", trait1 = "yes", trait2 = "yes"), 
        data.frame(species = "B", trait1 = "yes", trait2 = "no"),
        data.frame(species = "B", trait1 = "no", trait2 = "no"),
        data.frame(species = "B", trait1 = "no", trait2 = "no"),
        data.frame(species = "C", trait1 = "no", trait2 = "no"),
        data.frame(species = "D", trait1 = "yes", trait2 = "yes"),
        data.frame(species = "E", trait1 = "no", trait2 = "no"),
        data.frame(species = "E", trait1 = "no", trait2 = "no"))

我尝试了很多东西,包括 R 中的一些基本数据管理工具,还有duplicated, unique, 和match_df函数,但他们并没有完全做到这一点。

也许可以使用此类功能的组合版本,但我无法做到这一点。有什么简单的方法吗?

标签: rdataframedata-management

解决方案


一种使用基础 R 的方法,

first_part <- example[!is.na(example$trait1),]
second_part <- example[!is.na(example$trait2),]

merge(first_part[,-3], second_part[,-2], by="species")



   species trait1 trait2
1       A    yes    yes
2       B    yes     no
3       B     no     no
4       B     no     no
5       C     no     no
6       D    yes    yes
7       E     no     no
8       E     no     no

推荐阅读