[英]In R dataframe, consolidate 5 columns with similar names into a single dataframe column
鉴于以下 dataframe:
zed = data.frame(Title = c('a', NA, NA, NA, NA, NA), TITLE = c(NA, 'b', NA, NA, NA, NA), "Title/Description" = c(NA, NA, 'c', 'd', NA, NA), title = c(NA, NA, NA, NA, 'e', 'f'))
我们想将所有内容合并到一个Title
列中。 我们可以假设在每一行中,只有 1 个值不是 NA,我们正在寻找该值以添加到Title
列中。 我们可以通过以下方法将其合并:
yah <- zed %>%
dplyr::mutate(Title = ifelse(!is.na(Title), Title,
ifelse(!is.na(`Title.Description`), `Title.Description`,
ifelse(!is.na(TITLE), TITLE,
ifelse(!is.na(title), title, ""))))) %>%
dplyr::select(-Title.Description, -TITLE, -title)
然而,这种方法很混乱,如果 dataframe 有 10 个以上的标题列,它会变得更加混乱。 如果数据中不存在列,此方法也会中断:
# there's no TITLE2 --> ERROR
yah <- zed %>%
dplyr::mutate(Title = ifelse(!is.na(Title), Title,
ifelse(!is.na(`Title.Description`), `Title.Description`,
ifelse(!is.na(TITLE2), TITLE2,
ifelse(!is.na(title), title, ""))))) %>%
dplyr::select(-Title.Description, -TITLE2, -title)
关于如何 (a) 消除讨厌的 ifelse() 嵌套和 (b) 如果其中一列被省略则不抛出错误的任何建议。
dplyr
具有采用第一个非缺失值的coalesce
function:
yah <- zed %>%
mutate(Title = coalesce(
Title, Title.Description, TITLE2, title, ""
)
)
如果其中一列不存在,这仍然会中断。 我建议在运行之前识别任何缺失的列并将它们设置为NA
。
另一种选择是 select 只有包含单词title
的列(无论大小写),然后使用coalesce
。 我还给新列起了一个不同的名称,这样我就可以删除所有包含title
的列,然后重命名它。
library(tidyverse)
yah <- zed %>%
mutate(temp = coalesce(!!!select(., contains("title")))) %>%
select(-contains("title")) %>%
rename(Title = temp)
Output
yah
Title
1 a
2 b
3 c
4 d
5 e
6 f
另一种选择是将max
与c_across
一起使用:
zed %>%
rowwise() %>%
mutate(temp = max(c_across(contains("title")), na.rm = TRUE)) %>%
select(-contains("title")) %>%
rename(Title = temp)
或者另一种选择是使用reduce
和pmax
zed %>%
mutate(temp = reduce(select(., contains("title")), pmax, na.rm = TRUE)) %>%
select(-contains("title")) %>%
rename(Title = temp)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.