2015-10-06 72 views
0

我有兩個dataframes,看房子(N = 6)和特定日期(N = 22)。- [R比較列跨越Dataframes到匹配值

  • ORIGINAL是原始數據集。它包含對5個變量的38個觀察值。並非所有房屋都列出了所有日期,反之亦然,導致計算時出現不同長度變量的錯誤。

  • 樣本是一個新的空數據集。它包含132個(6×22)對同樣5個變量的觀察。現在每個家庭都有一個觀察每個日期。

    家貓鼬日水果大象

     A  1  40  7  0.6 
        A  6  32  12  4.2 
        B  2  50  3  4.0 
        B  4  51  4  8.6 
        B  6  8  7  12.1 
        C  2  12  8  13.0 
    

我試圖問R鍵兩個dataframes之間比較HouseID和日期填寫樣品的休息;如果它們匹配,其他變量(貓鼬,水果,大象)應該被複制以用於該觀察。

我想這無濟於事......

for(i in 1:nrow(original)) 
{ 
    if ((sample$Day == original$Day) && (sample$House == original$House)) 
    { 
    sample$Mongoose[i] <- original$Mongoose[i] 
    sample$Fruit[i]  <- original$Fruit[i] 
    sample$Elephant[i] <- original$Elephant[i] 
    } 
} 

以下結果:

我得到以下3個錯誤的序列

  • 在樣品$日==測試$天:較長物體長度不 較短對象長度的倍數

  • In is.na(e1)| is.na(E2):較長的對象長度不
    較短對象長度的倍數

  • ==.default(樣品$樓,測試$樓):較長的對象長度是
    不短對象長度
  • 的倍數

的數據並複製過來,但不正確。所有的價值被轉移到A房子和順序日期,而不是適當的房子和日期。

即,它看起來像這樣

House Day Mongoose Fruit Elephant 
A  1  40  7  0.6 
A  2  50  3  4.0 
A  3  51  4  8.6 
A  4  8  7  12.1 
A  5  12  8  13.0 
A  6  32  12  4.2 
B  1 
B  2 
B  3 [...] 

當應(本質)是這樣的:

House Day Mongoose Fruit Elephant 
A  1  40  7  0.6 
A  2  
A  3  
A  4  
A  5  
A  6  32  12  4.2 [rest of A houses have no data] 
B  1 
B  2  50  3  4.0 
B  3 
B  4  51  4  8.6 
B  5 
B  6  8  7  12.1 [rest of B houses have no data] 
C  1  
C  2  12  8  13.0 

請告知;我最終必須擴展這種技術,以查看具有198K條目的樣本數據集和115K的測試數據集。

謝謝!

+0

你可以舉一個例子,說明你的例子中'Original'的樣子嗎? – user295691

+0

以上所以我可以很好地格式化 – Sheegor

+0

更改'((樣本$天==原始$日)&&(樣本$房子==原始$房子))'''(樣本$天[i] ==原始$ Day [i])&&(樣本$ House [i] ==原始$ House [i]))'可能會工作 –

回答

1

聽起來好像這應該工作:

merge(sample, original, by = c("House", "Day"), all.x = TRUE) 

但很難說沒有一個重複的例子。你可能也想看看dplyr::left_join()。也就是說,假設你的數據如下所示:

sample <- data.frame(House = rep(c("A", "B", "C"), each = 6), 
        Day = rep(1:6, 3)) 

# head(sample) 
# House Day 
# 1  A 1 
# 2  A 2 
# 3  A 3 
# 4  A 4 
# 5  A 5 
# 6  A 6 

original <- data.frame(House = c("A", "A", "B", "B", "C"), 
         Day = c(1, 6, 2, 4, 2), 
         Mongoose = c(40, 32, 50, 51, 8), 
         Fruit = c(7, 12, 3, 4, 8), 
         Elephant = c(0.6, 4.2, 4.0, 8.6, 12.1)) 

# head(original) 
# House Day Mongoose Fruit Elephant 
# 1  A 1  40  7  0.6 
# 2  A 6  32 12  4.2 
# 3  B 2  50  3  4.0 
# 4  B 4  51  4  8.6 
# 5  C 2  8  8  12.1 

我們得到:

# head(merge(sample, original, by = c("House", "Day"), all.x = TRUE)) 
# House Day Mongoose Fruit Elephant 
# 1  A 1  40  7  0.6 
# 2  A 2  NA NA  NA 
# 3  A 3  NA NA  NA 
# 4  A 4  NA NA  NA 
# 5  A 5  NA NA  NA 
# 6  A 6  32 12  4.2 
+0

非常感謝!我似乎已經重複我的所有列的,所以我現在有: 家 日 Mongoose.x Fruit.x Elephant.x Mongoose.y Fruit.y 所有有用的日期是在House,Day和__。Y列。這不是一個大問題,我只是不明白我做了什麼 Elephant.y – Sheegor

0

這可能是一個小的調整,看這這行你原來的代碼:

if ((sample$Day == original$Day) && (sample$House == original$House)) 

看看你能不能改變它:

if ((sample$Day[i] == original$Day[i]) && (sample$House[i] == original$House[i])) 

因爲:

  • 您使用的是for環路以i變量,
  • 你用線如sample$Mongoose[i] <- original$Mongoose[i]
  • ,但在你的例子做的非常好看來if聲明實際上並沒有做使用i變量
  • 因此我們修改它以利用i,因此它將特別比較觀察/行的sample$Day與那個觀察/行的original$Day,以及s ame for sample$House vs original$House
+0

在這裏我得到一個錯誤的值,其中TRUE/FALSE需要。我也認爲這可能是有問題的,因爲我認爲它不會將示例$ day或示例$ house與原始文件中的所有條目進行比較。是不是隻是在同一個索引位置看條目,對吧? – Sheegor