将另一个数据框中的列名称替换为 R 中缺少的列名称?

标签 r merge matching missing-data

我有两个数据集:

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 的延伸,其中大部分代码使用 dplyrmelt/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/

相关文章:

algorithm - 多事件匹配算法

C++ 在两个 std::map 之间查找匹配项的有效方法

R 根据两列选择最高计数单元格

java - 我想用Java将4张图片合并在一起

sql-server - T-SQL 合并两个逗号分隔的列

r - 使用 R 将制表符 delim 文件合并为单个文件

javascript - 是否有一个 Regex 表达式来匹配每个不在引号中的内容

r - grouped_df_impl 中的错误(数据,取消命名(vars),删除): Column is unknown

mysql - RMySQL,获取错误 - RS-DBI 驱动程序警告 : (error while fetching rows)

r - 条形图 Y 轴中的不同起点(不是 0)?