2017-03-05 84 views
1

我中的R 2个dataframes:如何将一个R数据帧与另一个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 

这是不到我所期待的。我的错误在哪里?

+0

此语句中存在不一致”列名中的每个值都是唯一的,但在df1中,每行都不是唯一的(即有多行具有相同的作者)。“如果df1中的每一行都不是唯一的,并且某些行具有相同的作者,那么当名称构造df1时,Name是如何唯一的。同样在你的代码中你有First.Name和Second.Name,但它们不出现在df1中? – Djork

+0

@ R.S。我编辑了上述---谢谢。 – ShanZhengYang

+0

'subset_df2 < - 子集(df2,%df1 $ Name中的名称%)' – jdobres

回答

3

您可以使用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]将产生不正确的结果。

此外,索引数据帧时,您需要提供行范围和列范围。 “

+0

以上代码中的'LETTERS'是什么? – ShanZhengYang

+0

看起来'subset_df2 = df2 [df2 $%%df1 $ Name中的名称%]'和'subset_df2 = df2 [df2 $%%df1 $ Name中的名称]'之间没有区别。它是否正确? – ShanZhengYang

+0

您在评论中输入了完全相同的内容,但如果您的意思是'match'和'%in'',那么它们是相同的,请参阅'?match'的帮助文件以及'%in%定义为“%in%”< - 函数(x,table)匹配(x,table,nomatch = 0)> 0'。 'LETTERS'或'letters'是建立在R中的常量中的,它是字母表的一个向量,参见'?letters'。 – Djork

相关问题