簡體   English   中英

R比較數據框之間的列以匹配值

[英]R Compare Columns across Dataframes to Match Values

我有兩個數據框,分別用於查看房屋(n = 6)和某些日期(n = 22)。

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

  • SAMPLE是一個新的空數據集。 它包含關於相同5個變量的132(6 x 22)個觀測值。 現在每個家庭每個日期都有一個觀測值。

    House Day貓鼬水果大象

      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比較兩個數據幀之間的HouseID和Date來填充其余的SAMPLE; 如果它們匹配,則應復制其余變量(貓鼬,水果,大象)以進行觀察。

我嘗試這樣做無濟於事...

 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個錯誤

  • 在sample $ Day == test $ Day中:較長的對象長度不是較短的對象長度的倍數

  • 在is.na(e1)中| is.na(e2):更長的對象長度不是的倍數
    較短的物體長度

  • ==.default (sample $ House,test $ House)中:更長的對象長度是
    不是較短的物體長度的倍數

數據確實復制了,但是不正確。 所有值都將轉移到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的測試數據集。

謝謝!

在我看來這應該工作:

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

這可能是一個小的調整,請看一下原始代碼的這一行:

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

看看是否可以將其更改為:

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

因為:

  • 您正在使用帶i變量的for循環,
  • 您對諸如sample$Mongoose[i] <- original$Mongoose[i]行做得很好
  • 但在您的示例中,似乎if語句實際上並未使用i變量
  • 因此我們對其進行了修改,以使用i因此它將專門比較觀察值/行的sample$Day與該觀察值/行的original$Day ,並將sample$Houseoriginal$House

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM