【发布时间】:2018-09-14 09:51:28
【问题描述】:
我正在处理分类数据,并已将我的数据进行到最后第二步,然后才能以图形方式显示它。但是,我需要行来匹配条件,这就是我卡住的地方 - 卡住了,因为我不想手动操作。
我的数据:
x <- data.frame("Phylum" = c("Chordata", "Chordata", "Chordata", "Chordata", "Chordata", "Chordata"),
"Class" = c("NA", "Actinopterygii", "Actinopterygii", "Actinopterygii", "Actinopterygii", "Actinopterygii"),
"Order" = c("NA", "NA", "Gadiformes", "Gadiformes", "Gadiformes", "Gadiformes"),
"Family" = c("NA", "NA", "NA", "Moridae", "Moridae", "Moridae"),
"Genus" = c("NA", "NA", "NA", "NA", "Notophycis", "Notophycis"),
"Species" = c("NA", "NA", "NA", "NA", "NA", "Notophycis marginata"),
Number = c(21616, 12123, 1497, 730,730,730))
想要的最终结果:
y <- data.frame("Phylum" = c("Chordata", "Chordata", "Chordata", "Chordata"),
"Class" = c("NA", "Actinopterygii", "Actinopterygii", "Actinopterygii"),
"Order" = c("NA", "NA", "Gadiformes", "Gadiformes"), "Family" = c("NA", "NA", "NA", "Moridae"),
"Genus" = c("NA", "NA", "NA", "Notophycis"), "Species" = c("NA", "NA", "NA", "Notophycis marginata"),
Number = c(9493, 10626, 767, 730))
这是一个来自更大更复杂数据集的简单子集示例。因此,如果我能以某种方式将其放入代码中:
- 数字总和 (
Phylum == "P1" & Class == "NA") - 数字总和 (Class == "C1" & Order == "NA") 如果门匹配,这将等于 P1 的新数字 - 数字之和 (
Class == "C1" & Order== "NA") - 数字之和 (Order == "O1" & Family == "NA") 如果类匹配,这将 等于 C1 的新号码等...
但是如果 Number 与多行匹配,我需要有代码来评估这些行并选择 NA 数量最少的行并保留该 Number...
我想我想编写一个函数来执行此操作,但不知道从哪里开始!
感谢帮助:)
更新
测试人员:
Phylum Class Order Family Genus Species Reads_sum
Chordata Elasmobranchii Carcharhiniformes NA NA NA 31
Chordata Actinopterygii Perciformes Scombridae NA NA 589
Chordata Elasmobranchii Carcharhiniformes Pentanchidae NA NA 31
Chordata Actinopterygii Myctophiformes Myctophidae Notoscopelus NA 208
Chordata Actinopterygii Perciformes Scombridae Katsuwonus NA 589
Chordata Actinopterygii Myctophiformes Myctophidae Notoscopelus Notoscopelus caudispinosus 178
Chordata Actinopterygii Perciformes Scombridae Katsuwonus Katsuwonus pelamis 589
Cnidaria Hydrozoa Leptothecata Plumulariidae NA NA 69
Cnidaria Hydrozoa Leptothecata Plumulariidae Plumularia NA 69
Echinodermata Ophiuroidea NA NA NA NA 146
Echinodermata Ophiuroidea Ophiurida NA NA NA 137
Echinodermata Ophiuroidea Ophiurida Ophiuridae NA NA 137
Echinodermata Ophiuroidea Ophiurida Ophiuridae Ophioplinthus NA 137
Echinodermata Ophiuroidea Ophiurida Ophiuridae Ophioplinthus Ophioplinthus accomodata 137
Mollusca Cephalopoda Oegopsida Ommastrephidae NA NA 34311
Ochrophyta Phaeophyceae Ectocarpales Acinetosporaceae NA NA 29
执行我想要的但每次都必须更改变量的代码:
Tester$Reads_sum[Tester$Class == "Ophiuroidea" & Tester$Order == "NA"] - sum(Tester$Reads_sum[Tester$Class == "Ophiuroidea" & Tester$Order != "NA" & Tester$Family == "NA"])
所以我希望这样的事情会起作用,我只需要将 Class 更改为其他选定的分类等级:
for (i in unique(Tester$Class)){
Tester$Test.1 <- ifelse(Tester$Class != "NA" & Tester$Order == "NA",
Tester$Reads_sum[Tester$Class == i & Tester$Order == "NA"] - sum(Tester$Reads_sum[Tester$Class == i & Tester$Order != "NA" & Tester$Family == "NA"]), 0)
}
但它给了我一个 NA 而不是 9。
最终数据应如下所示:
Phylum Class Order Family Genus Species Reads_sum
Chordata Elasmobranchii Carcharhiniformes Pentanchidae NA NA 31
Chordata Actinopterygii Myctophiformes Myctophidae Notoscopelus NA 30
Chordata Actinopterygii Myctophiformes Myctophidae Notoscopelus Notoscopelus caudispinosus 178
Chordata Actinopterygii Perciformes Scombridae Katsuwonus Katsuwonus pelamis 589
Cnidaria Hydrozoa Leptothecata Plumulariidae Plumularia NA 69
Echinodermata Ophiuroidea NA NA NA NA 9
Echinodermata Ophiuroidea Ophiurida Ophiuridae Ophioplinthus Ophioplinthus accomodata 137
Mollusca Cephalopoda Oegopsida Ommastrephidae NA NA 34311
Ochrophyta Phaeophyceae Ectocarpales Acinetosporaceae NA NA 29
【问题讨论】:
-
您提供的数据集中没有
P1、C1、O1。 -
这些只是占位符,试图解释我想要用整个数据集实现的目标,而不仅仅是我在这里给出的子集,而是在这个例子中 P1 = Chordata, C1 = Actinopterygii, O1 = Gadiformes等等……
-
阅读您提供的逻辑,我觉得这并不容易。您是否找到了一种为单个简化案例手动编码的方法,我们可以看看吗?为什么输出中的数字变化如此之大?如果对未子集的行存在依赖关系,则使用数据集的简化版本而不是子集通常更容易
-
@Jonny 数字会发生变化,因为每一行都是该级别分类分辨率的总和,因此为了找出保持在较差分类分辨率下的数字,较高的分类分辨率必须从较贫穷的人中扣除。所以我找到了一个潜在的解决方案,但它不是 100% 有效,我将更新我的帖子,您可以获得数据集的简化版本和上面的潜在代码解决方案。
-
谢谢@AvdR,我在下面发布了一个解决方案,让我知道你的进展情况
标签: r function loops for-loop split