【问题标题】:Coalescing many columns into one column将多列合并为一列
【发布时间】:2020-05-01 15:41:50
【问题描述】:

如果我发布与我之前提出的问题类似的问题,我深表歉意,但我意识到我最初的问题不是很清楚。

我有一个五列六行的数据框(实际上它们更多,只是为了简化问题):

One Two Three   Four    Five
Cat NA  NA  NA  NA
NA  Dog NA  NA  NA
NA  NA  NA  Mouse   NA
Cat NA  Rat NA  NA
Horse   NA  NA  NA  NA
NA NA NA NA NA

现在,我想将所有信息合并到一个新的单列(“摘要”)中,如下所示:

Summary
Cat
Dog
Mouse
Error
Horse
NA

请注意Summary第四行报告的'Error',因为在合并过程中报告了两个不同的值。另外请注意,如果一行只有NA,应该报告'NA'而不是'错误' 我试图查看 dplyr 包中的 'coalesce' 函数,但它似乎并不能满足我的需要。 提前致谢。

【问题讨论】:

  • 我在您之前的问题上留下了相同的评论,但是看到您尝试过的代码,即使它没有按您的意愿工作,也可能有助于理解您的方法和逻辑

标签: r dataframe dplyr coalesce


【解决方案1】:

一个base R 选项可能是:

ifelse(rowSums(!is.na(df)) > 1, "Error", do.call(pmin, c(df, na.rm = TRUE))) 

[1] "Cat"   "Dog"   "Mouse" "Error" "Horse" NA 

【讨论】:

  • 使用pmin的出色解决方案!
【解决方案2】:

我们可以从dplyr 使用coalesce。有可能只有NA 列的类型为logical,当我们使用coalesce 时,这可能会发生冲突。一种选择是在该列的类中进行更改,然后 coalesce 将起作用

library(dplyr)
df1 %>%
   mutate_if(~ all(is.na(.)) && is.logical(.), ~ NA_character_) %>%
   transmute(Summary = case_when(rowSums(!is.na(.)) > 1 ~ "Error",
            TRUE ~ coalesce(!!! .)))
#  Summary
#1     Cat
#2     Dog
#3   Mouse
#4   Error
#5   Horse
#6    <NA>

数据

df1 <- structure(list(One = c("Cat", NA, NA, "Cat", "Horse", NA), Two = c(NA, 
"Dog", NA, NA, NA, NA), Three = c(NA, NA, NA, "Rat", NA, NA), 
    Four = c(NA, NA, "Mouse", NA, NA, NA), Five = c(NA, NA, NA, 
    NA, NA, NA)), class = "data.frame", row.names = c(NA, -6L
))

【讨论】:

  • 谢谢,但它应该在第四行报告“错误”
  • @Arturo 早些时候,我在考虑重复元素而不是同一行中的非 NA 计数
  • 谢谢,但它不适用于现实生活中的示例: library (RCurl) a download1645.mediafire.com/pp9z3okh5tgg/96px8ophovxrxe9/…) df2 % mutate_if(~ all(is.na(.)) && 是。 logical(.), ~ NA_character_) %>% transmute(Summary = case_when(rowSums(!is.na(.)) > 1 ~ "Error", TRUE ~ coalesce(!!! .))) '的第一行res' 应该是 'Normale'
【解决方案3】:

减少df 的列(从第一列开始),将当前列 (old) 与下一列 (new) 进行比较。对于每个元素:

  • 如果oldNA,选择new

  • 如果old不是NA,则选择old,除非new也不是NA,则'Error'

Reduce(
  function(old, new) ifelse(is.na(old), new, ifelse(!is.na(new), 'Error', old)),
  df)

# [1] "Cat"   "Dog"   "Mouse" "Error" "Horse" NA

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多