2017-03-29 90 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值的情況。