首页 > 解决方案 > 将许多列的内容放在一个新的单列中

问题描述

感谢您对我上一个问题的回答,但我需要更新它,因为这些解决方案不适用于我的真实示例,即 3170x11 数据框。

让我简要回顾一下。我有一个 3170X11 数据框,其中填充了“Normale”、“Delezioni”或 NA 等术语。我想将列结果合并到一个新列中,报告报告的术语类型,即确实是“Normale”、“Delezioni”或“NA”。如果“正常”和“NA”出现在同一行,则应报告“正常”。如果“Delezioni”和“NA”出现在同一行,则应报告“Delezioni”。如果仅存在“NA”,则应报告“NA”。但是,如果“Normali”和“Delezioni”都存在,则应报告“错误”。Akrun 和其他人报告了一个很好的解决方案(将许多列合并为一列),但是,正如我所说,没有

library (RCurl)
a <- getURL('http://download1645.mediafire.com/pp9z3okh5tgg/96px8ophovxrxe9/example.tab')
df2 <- read.table(text=a,header=TRUE, sep = "\t")
df2 <- data.frame(lapply(df2, as.character), stringsAsFactors=FALSE) #converts from factor to character
res <- df2 %>%
   mutate_if(~ all(is.na(.)) && is.logical(.), ~ NA_character_) %>%
   transmute(Summary = case_when(rowSums(!is.na(.)) > 1 ~ "Error",
            TRUE ~ coalesce(!!! .)))

res 包含几个错误。例如,第一行应该是:

  Summary
1   Normale
2    <NA>
3    <NA>
4    <NA>
5   Normale
6   Normale

相反,它们是:

> head (res)
  Summary
1   Error
2    <NA>
3    <NA>
4    <NA>
5   Error
6   Error 

谢谢

标签: rdplyrcoalesce

解决方案


以下对我有用,链接中的数据集。

f1 <- function(x){
  y <- unique(x[!is.na(x)])
  if(length(y) == 0) 
    NA 
  else if(length(y) == 1) 
    y 
  else "Error"
}

df2$Summary <- apply(df2, 1, f1)

并且不需要外部包,仅基于 R。


推荐阅读