通过从多个级别之一中选择来插入数据

inserting data by choosing from one of multiple levels

有 2 个数据帧

df1

  num organism tier    A    B    C    D    E
1   1      Ham    1 <NA>    a <NA> <NA>    b
2   1      Ham    1 <NA>    c <NA> <NA>    b
3   1      Sta    1    b <NA> <NA>    a    b
4   1      Sta    1    a <NA> <NA>    a    c
5   1      Sta    1 <NA> <NA> <NA> <NA> <NA>
6   2      Sta    2    c    c <NA>    a    b
7   2      Sta    2    a    c <NA>    b    a
8   3      Ham    3 <NA> <NA> <NA> <NA> <NA>


df2

  num tier name
1   1    1  Ham
2   1    1  Sta
3   2    2  Sta
4   3    3  Ham

我想从 df1 中找到与 num、organism 和 tier 匹配的列,并将 df1$A 到 df1$E 的信息插入。 有没有办法只选择最高级别而不是插入所有数据?

例如,如果级别 'a' > 'b' > 'c', 如果存在 'a',则插入 'a', 如果 'b' 存在而没有任何 'a',则插入 'b', 等等。 最后,如果只有 NA 或存在,则插入 NA。

我的最终结果应该是

df3

  num tier name    A     B    C    D    E
1   1    1  Ham  <NA>    a <NA> <NA>    b
2   1    1  Sta    a  <NA> <NA>    a    b
3   2    2  Sta    a     c <NA>    a    a
4   3    3  Ham  <NA> <NA> <NA> <NA> <NA>

我认为你甚至不需要 df2。将正确的级别分配给 ordered factor:

后只需 aggregate
ids <- match(c("num","organism","tier"), names(df1))
df1[-ids] <- lapply(df1[-ids], ordered, levels=c("c","b","a") )
aggregate(df1[-ids], df1[ids], FUN = max, na.rm=TRUE)

#  num organism tier    A    B    C    D    E
#1   1      Ham    1 <NA>    a <NA> <NA>    b
#2   1      Sta    1    a <NA> <NA>    a    b
#3   2      Sta    2    a    c <NA>    a    a
#4   3      Ham    3 <NA> <NA> <NA> <NA> <NA>

忽略 warnings() - R 只是警告您没有使用 max,如果您只有 NA 值。