将许多列的内容放在一个新的单列中
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。
感谢您回答我之前的问题,但我需要更新它,因为这些解决方案不适用于我的真实示例,即 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。