R 将多个列的内容放入新的单个列中

R 将多个列的内容放入新的单个列中,r,dplyr,coalesce,R,Dplyr,Coalesce,感谢您回答我的上一个问题,但我需要更新它,因为解决方案不适用于我的实际示例,即3170x11数据帧 让我简单地重述一下。我有一个3170X11的数据帧,里面充满了术语“Normale”、“Delezioni”或NA。我想将该列结果合并到一个新的列中,报告所报告的术语类型,即“Normale”、“Delezioni”或“NA”。如果“Normale”和“NA”出现在同一行上,则应报告为“Normale”。如果“Delezioni”和“NA”出现在同一行中,则应报告为“Delezioni”。如果只有

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

让我简单地重述一下。我有一个3170X11的数据帧,里面充满了术语“Normale”、“Delezioni”或NA。我想将该列结果合并到一个新的列中,报告所报告的术语类型,即“Normale”、“Delezioni”或“NA”。如果“Normale”和“NA”出现在同一行上,则应报告为“Normale”。如果“Delezioni”和“NA”出现在同一行中,则应报告为“Delezioni”。如果只有“不适用”,则应报告为“不适用”。但是,如果同时存在“Normali”和“Delezioni”,则应报告“Error”。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 

谢谢

我认为您可以根据自己的需求定义一个简单的功能

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
}
如果需要tidyverse/dplyr答案,我们可以将这些多个If语句转换为case_when,然后使用pmap


我认为您可以根据自己的需求定义一个简单的函数

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
}
如果需要tidyverse/dplyr答案,我们可以将这些多个If语句转换为case_when,然后使用pmap


以下内容适用于我,使用链接中的数据集

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)

并且不需要外部软件包,只需要base R。

以下内容适用于我,数据集位于链接中

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)

而且不需要外部软件包,只需要base R。

谢谢,但是有错误。例如,df2$Summary的第一个元素应该是“Normale”,而不是“Errors”。谢谢,但是有错误。例如,df2$Summary的第一个元素应该是“Normale”,而不是“Errors”。例如$answer@Arturo您是否使用了正确的数据帧名称?我用的是一个例子,我想在你们的例子中是df2。您还需要在控制台中运行apply_fun,以便该功能出现在您的环境中。是的。即使使用df2,也不要更改:示例$answer df2$answer它可以工作!非常感谢您和其他回答我问题的人。示例$answer@Arturo您是否使用了正确的数据帧名称?我用的是一个例子,我想在你们的例子中是df2。您还需要在控制台中运行apply_fun,以便该功能出现在您的环境中。是的。即使使用df2,也不要更改:示例$answer df2$answer它可以工作!非常感谢你和另一位回答我问题的人。