R 将多个列的内容合并为一个列

R 将多个列的内容合并为一个列,r,dplyr,R,Dplyr,我有一个5列6行的数据框架(实际上它们更多,只是为了简化问题): 现在,我想将所有信息合并到一个新的单列(“摘要”),如下所示: Summary Cat Dog Mouse Error Horse NA 请注意第四个摘要行中报告的“错误”,因为在合并过程中报告了两个不同的值。我试图查看dplyr包中的“coalesce”函数,但它似乎并不能满足我的需要。 提前谢谢 已编辑:我添加了第6行,表示如果第6行中的所有“NA”,我希望在“摘要”列中得到“NA”,而不是“错误”。很抱歉,如果我在第一篇文

我有一个5列6行的数据框架(实际上它们更多,只是为了简化问题):

现在,我想将所有信息合并到一个新的单列(“摘要”),如下所示:

Summary
Cat
Dog
Mouse
Error
Horse
NA
请注意第四个摘要行中报告的“错误”,因为在合并过程中报告了两个不同的值。我试图查看dplyr包中的“coalesce”函数,但它似乎并不能满足我的需要。 提前谢谢


已编辑:我添加了第6行,表示如果第6行中的所有“NA”,我希望在“摘要”列中得到“NA”,而不是“错误”。很抱歉,如果我在第一篇文章中不清楚这一点。

这里有一个通过
应用的想法

apply(df, 1, function(i){i1 <- i[!is.na(i)]; if(length(i1) > 1){'Error'}else{i1}})
#[1] "Cat"   "Dog"   "Mouse" "Error" "Horse"
apply(df,1,函数(i){i11){'Error'}else{i1})
#[1] “猫”“狗”“鼠标”“错误”“马”

我会使用apply来解决这个问题,因为您需要处理特定的案例。乙二醇

df[1]“猫”“狗”“鼠标”“错误”“马”

由(v0.3.0)于2020-01-14创建的另一种方法是使用
dplyr中的新
pivot\uu
功能:

df <- tribble(~One, ~Two, ~Three,   ~Four,    ~Five,
              "Cat", NA,  NA,  NA,  NA,
              NA,  "Dog", NA,  NA,  NA,
              NA,  NA,  NA,  "Mouse",   NA,
              "Cat", NA,  "Rat", NA,  NA,
              "Horse",   NA,  NA,  NA,  NA)

df %>% 
  pivot_longer(names_to = "variable", values_to = "Summary", 
               values_drop_na = TRUE, cols = One:Five) %>% 
  distinct(Summary)
# # A tibble: 5 x 1
# Summary
# <chr>  
# 1 Cat    
# 2 Dog    
# 3 Mouse  
# 4 Rat    
# 5 Horse  
df%
pivot_更长(name_to=“variable”,value_to=“Summary”,
值\u drop\u na=TRUE,cols=1:5)%>%
不同(摘要)
##tible:5 x 1
#总结
#   
#一只猫
#2只狗
#3只老鼠
#4老鼠
#5匹马
  • 下面是另一个基本的R解决方案,使用
    sapply()
    +
    ifelse()
  • 或者您可以使用
    sapply()
    +
    ifelse()
数据

df <- structure(list(One = c("Cat", NA, NA, "Cat", "Horse"), Two = c(NA, 
"Dog", NA, NA, NA), Three = c(NA, NA, NA, "Rat", NA), Four = c(NA, 
NA, "Mouse", NA, NA), Five = c(NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-5L))

df您也可以使用coalesce

df %>%
  mutate_all(as.character) %>% 
  mutate(coal = coalesce(!!!syms(names(.))),
         sum_na = rowSums(!is.na(.)),
         result = if_else(sum_na == 1,coal,"Error")) %>% 
  select(result)

这回答了你的问题吗?你到底试过什么代码?你说“请注意错误”,但你没有包括你做了什么来返回错误value@Adamm. 不是真的,因为它不处理错误条件,而且我必须将所有不处理错误条件的colnames命名为OPmentioned@alanocallaghan解决了操作中不处理错误条件的问题mentioned@alanocallaghan在OP中不清楚,将不得不编辑.hgh>library(RCurl)>a谢谢。您的示例在我提供的示例中效果很好,但在我的真实测试用例(一个11x3170数据帧,具有列名称):library(RCurl)中失败。很抱歉,我之前的评论格式不好,但我无法编辑帖子。希望你也能同样经历。
> r
     V1      V2      V3      V4      V5 
  "Cat"   "Dog" "Mouse" "Error" "Horse"
r <- apply(df, 1, function(x) ifelse(length(z <- unique(na.omit(x)))==1, z,"Error"))
> r
[1] "Cat"   "Dog"   "Mouse" "Error" "Horse"
df <- structure(list(One = c("Cat", NA, NA, "Cat", "Horse"), Two = c(NA, 
"Dog", NA, NA, NA), Three = c(NA, NA, NA, "Rat", NA), Four = c(NA, 
NA, "Mouse", NA, NA), Five = c(NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-5L))
df %>%
  mutate_all(as.character) %>% 
  mutate(coal = coalesce(!!!syms(names(.))),
         sum_na = rowSums(!is.na(.)),
         result = if_else(sum_na == 1,coal,"Error")) %>% 
  select(result)