R 将多个列的内容放入新的单个列中
感谢您回答我的上一个问题,但我需要更新它,因为解决方案不适用于我的实际示例,即3170x11数据帧 让我简单地重述一下。我有一个3170X11的数据帧,里面充满了术语“Normale”、“Delezioni”或NA。我想将该列结果合并到一个新的列中,报告所报告的术语类型,即“Normale”、“Delezioni”或“NA”。如果“Normale”和“NA”出现在同一行上,则应报告为“Normale”。如果“Delezioni”和“NA”出现在同一行中,则应报告为“Delezioni”。如果只有“不适用”,则应报告为“不适用”。但是,如果同时存在“Normali”和“Delezioni”,则应报告“Error”。Akrun和其他人报告了一个很好的解决方案,但正如我所说,当事情变得更大时,它就不起作用了:R 将多个列的内容放入新的单个列中,r,dplyr,coalesce,R,Dplyr,Coalesce,感谢您回答我的上一个问题,但我需要更新它,因为解决方案不适用于我的实际示例,即3170x11数据帧 让我简单地重述一下。我有一个3170X11的数据帧,里面充满了术语“Normale”、“Delezioni”或NA。我想将该列结果合并到一个新的列中,报告所报告的术语类型,即“Normale”、“Delezioni”或“NA”。如果“Normale”和“NA”出现在同一行上,则应报告为“Normale”。如果“Delezioni”和“NA”出现在同一行中,则应报告为“Delezioni”。如果只有
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它可以工作!非常感谢你和另一位回答我问题的人。