2017-07-13 13 views
0

2つの異なるデータフレームを使用しています。もう一方の情報に含まれている情報を使用して完成させたいと思います。最初のデータフレームには、誕生日と出生地が分かっている個々の幼い動物の観察リストが含まれています。第2のデータフレームは、与えられた時間間隔内に与えられた領域に存在する成体動物の観察を含む。ここ は再現例です。日付と条件付きで2つのデータフレームを結合する

#First dataframe: 
ID_young <- c(rep(c("a", "b", "c"), each=3), "d") # All individuals observed three times except "d", observed once 
Territory_young <- c(rep(c("x", "y", "z"), each=3), "x") # All individuals are from different territories, except "a" and "d" who are from the same territory, namely "x". 
Birthdate <- c(rep(c("2014-01-29", "2014-12-17", "2013-11-19"), each=3), "2012-12-04") 
Birthdate <- as.Date(Birthdate) 

# Second dataframe: 
ID_adult <- c("e", "f", "g", "h", "i", "j", "e","f") 
Territory_adult <- c("x", "x", "y", "z", "z", "z", "z", "w") 
First_date <- as.Date(c("2014-01-01", "2014-01-15", "2013-12-14", "2013-05-17", "2013-05-09", "2012-09-01", "2013-06-18", "2011-04-17")) 
Last_date <- as.Date(c("2014-02-28", "2014-04-17", "2014-11-02", "2014-01-13", "2015-01-03", "2013-04-17", "2013-12-25", "2014-11-11")) 

# Data frames complete: 
df1 <- data.frame(ID_young, Territory_young, Birthdate) 
df2 <- data.frame(ID_adult, Territory_adult, First_date, Last_date) 

私の目標は、その誕生の時に若い動物の領土に存在する成体動物の数で構成されていDF1で新しい列を作成することです。すなわち 、DF1の各ラインについて

  • DF2 $ First_dateおよびDF2 $ LAST_DATE間隔がDF1を含む場合DF2の行数をカウントDF2
  • に対応する領域を見つけます。たとえば、

DF1の新しい列でその数は$生年月日

  • 塗りつぶし、DF1の最初の3行のために(若いアニメーションに対応若い "a"が生まれたとき(2014-01-29)、大人の "e"と "f"が "x"の領域に存在していたため、その数は2になります。

    誰かが私にそれを可能にする条件付きステートメントの正しい組み合わせを策定するのに役立つでしょうか?私は現時点での陳述をしようとしていますが、何の価値もありません。

    ありがとうございます!

  • +0

    お望みの出力と試したものを提供してください – RUser

    +0

    'data.table'から' foverlaps'を試してください – akrun

    +0

    私はちょうどその結果の数字の例を挙げました。私は 'for'と' if'文を試していますが、表示する価値はありません。明確ではない具体的な点はありますか? –

    答えて

    1
    nb.adults = apply(df1, 1, function(row, df2) { 
        terr = as.character(row[2]) 
        bd = row[3] 
        nb.adults = length(which(df2$First_date < bd & bd < df2$Last_date & 
    df2$Territory_adult==terr)) 
        return(nb.adults) 
    }, df2) 
    
    df1 = cbind(df1, nb.adults) 
    
    関連する問題