我有两个数据集:
a.数据框如下所示:
SpeciesA SpeciesB SpeciesC SpeciesD SpeciesE SpeciesY SpeciesZ
Site1 1 0 4 6 2 5 2
Site2 1 0 4 6 2 5 3
Site3 1 0 4 6 2 5 4
Site4 1 0 4 6 2 5 5
(注意:行值不相同。这仅用于此处表示的目的)
b.另一个数据集如下所示:
Order Species
Order1 SpeciesA
Order1 SpeciesB
Order2 SpeciesC
Order2 SpeciesD
Order3 SpeciesE
请注意,某些物种(例如 SpeciesZ、SpeciesY)在 (b) 中没有相应的“目”。
我想将数据集(2)中的顺序列与数据框(1)中相应的物种相匹配,并将同一顺序下的值(如果有多个物种)相加。当物种没有对应的 Order 时(例如 SpeciesY、SpeciesZ),我想将该列重命名为 NULL,然后将其删除(注意我需要这两个步骤)
预最终输出
Order1 Order1 Order3 NULL NULL
Site1 1 10 2 5 2
Site2 1 10 2 5 3
Site3 1 10 2 5 4
Site4 1 10 2 5 5
最终输出
Order1 Order2 Order3
Site1 1 10 2
Site2 1 10 2
Site3 1 10 2
Site4 1 10 2
这是问题 asked here 的延伸,其中大部分代码使用 dplyr
或 melt
/reshape
函数。然而,我发现很难对此执行相同的分析,因为它会抛出一个错误,指出某些物种没有相应的值
最佳答案
一种方法是使用 match
创建索引,使用 Order
列分割
数据集子集,循环遍历 列出
元素并获取rowSums
i1 <- match(colnames(df1), df2$Species, nomatch = 0)
data.frame(lapply(split.default(df1[i1], df2$Order[i1]), rowSums))
# Order1 Order2 Order3
#Site1 1 10 2
#Site2 1 10 2
#Site3 1 10 2
#Site4 1 10 2
或者我们可以将第一个数据集转换为“长”格式,与第二个数据集连接,按列分组,获取值列的总和
,并将其重新调整回“宽”格式
library(tidyverse)
rownames_to_column(df1, "rn") %>%
gather(Species, Val, -rn) %>%
left_join(., df2, by = "Species") %>%
na.omit() %>%
group_by(rn, Order) %>%
summarise(Val = sum(Val)) %>%
spread(Order, Val)
关于将另一个数据框中的列名称替换为 R 中缺少的列名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42685125/