[英]Match/subset one dataframe based on conditional values in another dataframe in R
[英]How to subset one R dataframe with the values of another R dataframe?
我在R中有兩個數據幀:
Died.At <- c(22,40,72,41, ...)
Writer.At <- c(16, 18, 36, 36)
Name <- c("John Doe", "Edgar Poe", "Walt Whitman", "Jane Austen", ...)
Gender <- c("MALE", "MALE", "MALE", "FEMALE", ...)
Date.Of.Death <- c("2015-05-10", "1849-10-07", "1892-03-26","1817-07-18", ...)
Pet <- c("cat", "dog", "cat", "cat")
df1 = data.frame(Died.At, Writer.At, Name, Gender, Pet)
print(df1)
Died.At Writer.At Name Gender Pet
1 22 16 John Doe MALE cat
2 40 18 Edgar Poe MALE dog
3 72 36 Walt Whitman MALE cat
4 41 36 Jane Austen FEMALE cat
.....
在df1
, Name
每一行都不是唯一的(即有多個行具有相同的作者。)
第二個數據幀df2
,還有一個Name
其中包含來自df1
兩位作者(例如Jane Austen)和全新的作者。 這個數據框架也要大得多。
print(length(unique(df1$Name)))
## output 1168
print(length(unique(df2$Name)))
## output 5572
我想將df2
子集化,使得唯一的名稱是來自df1
的名稱。
我的想法是這樣做:
subset_df2 = df2[df2$Name == unique(df1$Name)]
但是,我希望這里有1168個獨特的作者姓名:
print(length(unique(subset_df2$Name)))
## output 880
這比我預期的要少。 我的錯誤在哪里?
您可以df2$Name %in% df1$Name
中使用match(df2$Name, df1$Name)
或df2$Name %in% df1$Name
,返回df2 $ Name長度的邏輯向量,邏輯TRUE,其中df2 $ Name在df1 $ Name中。 然后,您可以使用它來索引df2。
subset_df2 <- df2[df2$Name %in% df1$Name, ]
看?match
至於為什么你的代碼不起作用,請參閱本練習的輸出:
a = LETTERS[sample(1:10, size=15, replace=T)]
b = c(unique(a), LETTERS[15:30])
# compare
b == unique(a)
b[b == unique(a)]
# vs
b %in% a
b[b %in% a]
另請注意b %in% a
不等於a %in% b
,因此b[a %in% b]
將產生不正確的結果。
此外,在索引數據框時,您需要提供行范圍和列范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.