【问题标题】:Merge two columns with Factors and NAs将两列与因子和 NA 合并
【发布时间】:2017-03-20 13:14:59
【问题描述】:

我有两列包含因子,我想合并。由于我有很多观察,我想知道是否有 dplyr 或 tidyr 的快速选项。

Col1    Col2
 A        NA
 B        NA
 NA       C
 A        A
 NA       B
 A        NA
 B        B

我知道这应该不难,但我显然在这里遗漏了一些东西。我尝试了几个选项,但由于我想保留这些因素,我知道的所有选项都不起作用。

请注意,当两列都有结果时,它们将始终相同。但这是我拥有的数据特征的一部分。 我希望有这样的东西:

Col1    Col2     Col3
 A        NA      A
 B        NA      B
 NA       C       C
 A        A       A
 NA       B       B
 A        NA      A
 B        B       B

【问题讨论】:

  • 如果没有一列是 NA 怎么办?
  • 如果它们不是 NA,它们将完全相同。但我会在这个问题上进行编辑。
  • 我认为 dplyr 或 tidyr 不适合这样的任务。我会选择好的 ol' base R df[cbind(1:nrow(df), max.col(!is.na(df)))]
  • 或使用ifelse:df$c <- ifelse(is.na(df$col1), as.character(df$col2), as.character(df$col1))。如有必要,您可以将其包装在 factor 中。
  • @FilipeTeixeira 如果您想将它们保留为factors,只需将其包装为factor,如lmo 所述。所以大卫的回答试试,factor(df[cbind(1:nrow(df), max.col(!is.na(df)))]).

标签: r dplyr tidyr


【解决方案1】:

我认为这应该使用dplyr

library('dplyr')
dat %>% 
 mutate(Col3 = if_else(is.na(Col1),Col2, Col1))

【讨论】:

  • 它可以工作,但它以某种方式将我的因子转换为数字。不知道为什么。
  • @FilipeTeixeira ifelse() 倾向于这样做。 dat %>% mutate(Col3 = as.factor(ifelse(is.na(Col1),as.character(Col2), as.character(Col1)))) 应该解决这个问题。
  • 回答这个问题stackoverflow.com/questions/6668963/…解释为什么ifelse()会这样做并提供解决方案。提示:使用dplyr::if_else
  • 不错!我更新为使用if_else(谢谢@wjchulme!)我默认使用stringsAsFactors=FALSE(或使用tibble)所以我没有注意到它正在这样做。
  • @wjchulme 实际上这非常有用:D。爱它。谢谢
猜你喜欢
  • 2018-06-25
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多