【问题标题】:Combining 2 columns in R prioriziting one of them将 R 中的 2 列合并为其中之一
【发布时间】:2017-02-15 17:14:53
【问题描述】:

我对 R 一无所知,我有一个包含 2 列的 data.frame,它们都是关于动物的性别,但其中一个有一些更正,另一个没有。

我想要的 data.frame 是这样的:

    id  sex  father mother birth.date  farm
    0    1    john   ray   05/06/94     1
    1    1    doug   ana   18/02/93     NA
    2    2    bryan  kim   21/03/00     3

但我通过在其他 2 个 data.frames 上使用合并得到了这个 data.frame

  id sex.x father mother birth.date sex.y farm
    0    2    john   ray    05/06/94    1     1
    1    1    doug   ana    18/02/93    NA    NA
    2    2    bryan  kim    21/03/00    2     3

data.frame 1 或 Animals(某些动物的性别错误)

 id sex father mother birth.date
  0  2   john   ray    05/06/94
  1  1   doug   ana    18/02/93
  2  2   bryan  kim    21/03/00

data.frame 2 或 Farm(具有正确的性别):

 id farm sex
  0  1    1
  2  3    2

我使用的代码是:Animals_Farm <- merge(Animals , Farm, by="id", all.x=TRUE)

我需要将 2 个性别列合并为一个,优先考虑 sex.y。我该怎么做?

【问题讨论】:

  • 欢迎来到 R。检查这个高度标记的 Q。stackoverflow.com/questions/5963269/…。然后尝试提供输入数据的详细信息,您想要的输出是什么。
  • 这对于来自 dplyr 包的 coalesce 来说是一项很好的任务。
  • sex <- ifelse(!is.na(sex.y), sex.y, sex.x)
  • 我如何使用这种性别
  • 所以你需要这个merge(df, df1[,-3], by="id", all.x=TRUE)

标签: r merge multiple-columns


【解决方案1】:

如果我正确理解了您的示例,您的情况类似于我根据merge 函数的示例在下面显示的情况。

> (authors <- data.frame(
      surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")),
      nationality = c("US", "Australia", "US", "UK", "Australia"),
      deceased = c("yes", rep("no", 3), "yes")))

   surname nationality deceased
1    Tukey          US      yes
2 Venables   Australia       no
3  Tierney          US       no
4   Ripley          UK       no
5   McNeil   Australia      yes

> (books <- data.frame(
      name = I(c("Tukey", "Venables", "Tierney",
                 "Ripley", "Ripley", "McNeil", "R Core")),
      title = c("Exploratory Data Analysis",
                "Modern Applied Statistics ...", "LISP-STAT",
                "Spatial Statistics", "Stochastic Simulation",
                "Interactive Data Analysis",
                "An Introduction to R"),
      deceased = c("yes", rep("no", 6))))

      name                         title deceased
1    Tukey     Exploratory Data Analysis      yes
2 Venables Modern Applied Statistics ...       no
3  Tierney                     LISP-STAT       no
4   Ripley            Spatial Statistics       no
5   Ripley         Stochastic Simulation       no
6   McNeil     Interactive Data Analysis       no
7   R Core          An Introduction to R       no

> (m1 <- merge(authors, books, by.x = "surname", by.y = "name"))

   surname nationality deceased.x                         title deceased.y
1   McNeil   Australia        yes     Interactive Data Analysis         no
2   Ripley          UK         no            Spatial Statistics         no
3   Ripley          UK         no         Stochastic Simulation         no
4  Tierney          US         no                     LISP-STAT         no
5    Tukey          US        yes     Exploratory Data Analysis        yes
6 Venables   Australia         no Modern Applied Statistics ...         no

authors 可能代表您的第一个数据框,books 您的第二个数据框,deceased 可能是两个数据框内的值,但仅在其中一个数据框内是最新的 (authors)。

仅包含正确值 deceased 的最简单方法是从合并中排除不正确的值。

> (m2 <- merge(authors, books[names(books) != "deceased"], 
               by.x = "surname", by.y = "name"))

   surname nationality deceased                         title
1   McNeil   Australia      yes     Interactive Data Analysis
2   Ripley          UK       no            Spatial Statistics
3   Ripley          UK       no         Stochastic Simulation
4  Tierney          US       no                     LISP-STAT
5    Tukey          US      yes     Exploratory Data Analysis
6 Venables   Australia       no Modern Applied Statistics ...

代码行books[names(books) != "deceased"] 只是对数据框books 进行子集化,以删除deceased 列,在最终合并中仅从authors 中留下正确的deceased 列。

【讨论】:

  • 问题是数据框 Animals 的动物比数据框 Farm 多,所以我不能只删除 sex.x
  • 这就是为什么一个可重现的例子来展示你试图克服的挑战是很重要的。在这种情况下,我会在@rawr 的问题下方的 cmets 中推荐解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多