2017-06-13 64 views
0

我有兩個dataframes合併從數據幀到另一個一些列:DF1和DF2如何通過一個條件

df1=read.table(text="group co 
    A 24952 
    A 56826865 
    A 56829677 
    B 10951 
    B 24200 
    B 48557215 
    B 49537767", header=T, stringsAsFactors=F) 

df2=read.table(text="group n1 n2 n3 n4 
    A 29671 0 46373 0.02 
    B 51236 0 57911 0.1 
    A 56483059 121.37 56826203 178.28 
    B 48497604 164.98 48531024 164.98", header=T, stringsAsFactors=F) 

我想合併列2:由下列條件5 df2df1

df2df1相應行5 min(df2$n1)行的;:
  • df1$group==df2$group & if df1$co < min(df2$n1)在同一組中,然後合併第2列
  • if df1$co > max(df2$n3),然後將max(df2$n1)行的列2:5從df2合併到df1中的相應行中。

結果預計爲:

result=read.table(text="group co n1 n2 n3 n4 
    A 24952 29671 0 46373 0.02 
    A 56826865 56483059 121.37 56826203 178.28 
    A 56829677 56483059 121.37 56826203 178.28 
    B 10951 51236 0 57911 0.1 
    B 24200 51236 0 57911 0.1 
    B 48557215 48497604 164.98 48531024 164.98 
    B 49537767 48497604 164.98 48531024 164.98", header=T, stringsAsFactors=F) 

感謝幫助。

回答

1

使用dplyr

require(dplyr) 

首先,我修改了數據幀df2知道哪一行是一個最小行,這是一個最大的一行:

df2 %<>% group_by(group) %>% 
    mutate(cond2 = ifelse(n1 == min(n1), "min", ifelse(n3 == max(n3), "max", NA))) %>% 
    ungroup 

然後,我加入這兩個dataframes和過濾器:

df1 %>% left_join(df2, by = "group") %>% 
    group_by(group, co) %>% 
    mutate(cond = ifelse(co < min(n1), "min", ifelse(co > max(n3), "max", NA))) %>% 
    ungroup %>% 
    filter(cond == cond2) %>% 
    select(-cond, -cond2) 

這給出了輸出:

Source: local data frame [7 x 6] 

    group  co  n1  n2  n3  n4 
1  A 24952 29671 0.00 46373 0.02 
2  A 56826865 56483059 121.37 56826203 178.28 
3  A 56829677 56483059 121.37 56826203 178.28 
4  B 10951 51236 0.00 57911 0.10 
5  B 24200 51236 0.00 57911 0.10 
6  B 48557215 48497604 164.98 48531024 164.98 
7  B 49537767 48497604 164.98 48531024 164.98