将许多列的内容放在一个新的单列中

Putting the content of many columns in a new single column

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

让我简要概括一下。我有一个 3170X11 数据框,其中填充了术语 'Normale'、'Delezioni' 或 NA。我想将列结果合并到一个新列中,报告所报告的术语类型,即 'Normale'、'Delezioni' 或 'NA'。如果 'Normale' 和 'NA' 出现在同一行,则应报告为 'Normale'。如果 'Delezioni' 和 'NA' 出现在同一行,则应报告为 'Delezioni'。如果只有 'NA' 存在,则应报告 'NA'。但是,如果 'Normali' 和 'Delezioni' 都存在,则应报告为 'Error'。 Akrun 和其他人报告了一个很好的解决方案 (Coalescing many columns into one column),但是,正如我所说,当事情变得更大时,它不起作用:

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 

谢谢

我想你可以定义一个简单的函数,它可以根据你的要求工作

apply_fun <- function(x) {
  if(all(c("Delezioni","Normale") %in% x)) return('Error')
  if("Delezioni" %in% x) return('Delezioni')
  if("Normale" %in% x)  return('Normale')
  else NA
}

然后 apply 按行

example$answer <- apply(example, 1, apply_fun)
head(example$answer)
#[1] "Normale" NA        NA        NA        "Normale" "Normale"

如果需要 tidyverse/dplyr 答案,我们可以将这些多个 if 语句转换为 case_when,然后使用 pmap

library(tidyverse)

apply_fun <- function(x) {
  case_when(all(c("Delezioni","Normale") %in% x) ~ "Error", 
            "Delezioni" %in% x ~ "Delezioni", 
            "Normale" %in% x ~ "Normale", 
            TRUE ~NA_character_)
}

output <- example %>% mutate(answer = pmap_chr(., ~apply_fun(c(...))))

以下对我有用,数据集在 link。

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。