【问题标题】:How to subset one R dataframe with the values of another R dataframe?如何用另一个 R 数据框的值对一个 R 数据框进行子集化?
【发布时间】:2017-03-05 03:30:46
【问题描述】:

我在 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

这比我预期的要少。我的错误在哪里?

【问题讨论】:

  • 此语句中存在不一致“名称列中的每个值都是唯一的。但是,在 df1 中,并非每一行都是唯一的(即有几行具有相同的作者。)。”如果 df1 中的每一行都不是唯一的,并且某些行具有相同的作者,那么当 df1 由 Name 构造时,Name 是如何唯一的。同样在您的代码中,您有 First.Name 和 Second.Name 但它们没有出现在 df1 中?
  • @R.S.我编辑了以上内容---谢谢。
  • subset_df2 &lt;- subset(df2, Name %in% df1$Name)

标签: r dataframe


【解决方案1】:

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

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

【讨论】:

  • 看来subset_df2 = df2[df2$Name %in% df1$Name]subset_df2 = df2[df2$Name %in% df1$Name, ] 之间没有区别。这是正确的吗?
  • 您在评论中输入了完全相同的内容,但如果您的意思是 match%in%,是的,它们是相同的,请参阅 ?match 的帮助文件,并在下面详细说明 @987654334 @ 定义为"%in%" &lt;- function(x, table) match(x, table, nomatch = 0) &gt; 0LETTERSletters 内置于 R 中的常量,字母向量,请参阅 ?letters
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多