2017-03-29 63 views
1

2个dataframes之一插入数据作为通过选择从多个级别

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,生物体中的列,以及层和插入来自DF1 $ A的信息来DF1 $ E。 而不是插入所有的数据,有没有办法只选择最高级别?

,例如,如果水平 '一个'> 'B'> 'C', 插入 'A',如果 'A' 存在时, 插入 'B',如果 'B' 是本wihout任何“一个的, 等等。最后,如果只有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> 

回答

2

我不认为你甚至需要df2。只是aggregate分配正确的水平进行orderedfactor后:

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值的情况。