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