繁体   English   中英

在 R dataframe 中,将 5 个名称相似的列合并为一个 dataframe 列

[英]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

另一种选择是将maxc_across一起使用:

zed %>%
  rowwise() %>%
  mutate(temp = max(c_across(contains("title")), na.rm = TRUE)) %>% 
  select(-contains("title")) %>% 
  rename(Title = temp)

或者另一种选择是使用reducepmax

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM