[英]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$House
與original$House
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.