基于R中的模式合并列

时间:2019-06-26 15:20:53

标签: r regex dplyr coalesce

我在R中组合了数据集,并且每个数据集可能对同一数据使用不同的列名。我需要使用正则表达式来标识需要合并的列的名称,然后通过合并来运行该列名称列表。

我知道正确的正则表达式表达式来标识我的列,并且我知道如何将列名称手动写入合并函数以组合这些列,但是我不知道如何自动合并由正则表达式标识的列。 / p>

sample = data.frame("PIDno" = c('a', NA, NA), "PINID" = c(NA, 'b', NA), "ParcelId" = c(NA, NA, 'c'))

PID_search = paste("sample$",grep("*PID*|*PIN*|*PARCEL*",colnames(sample),ignore.case = TRUE, value = TRUE),sep = "")

sample$PID_combine = coalesce(sample$'PIDno',
                              sample$'PINID',
                              sample$'ParcelId')

3 个答案:

答案 0 :(得分:3)

这就是我要怎么做。

  • (a)不要将"sample$PIDno"作为字符串使用-这毫无用处。只需将列名称作为字符串即可。
  • (b)我们将创建一个单独的函数,该函数在数据框中的所有列上调用coalesce。这很容易写,然后我们就可以...
  • (c)在要合并的列的子集上调用coalesce_df函数。根据列名的向量对数据框进行子集化很容易,因此我们简化了第一步,并添加了两个附加的简单步骤来获得结果。

对于您的示例数据,列都是具有不同级别的所有factor。无法原样合并,因此我添加了lapply(..., as.character),首先将所有内容转换为字符。如果您的真实数据不是factor类,则可以跳过该步骤。

cols = grep("*PID*|*PIN*|*PARCEL*",colnames(sample),ignore.case = TRUE, value = TRUE)

coalesce_df = function(df) {
  do.call(coalesce, df)
}

coalesce_df(lapply(sample[cols], as.character))
# [1] "a" "b" "c"

如果您想在dplyr管道中完成这项工作,我建议使用类似的方法(或从akrun的答案中获得更多习惯用法)。

sample %>%
  mutate_at(vars(one_of(cols)), as.character) %>%
  mutate(PID_combine = coalesce_df(.[cols]))
#   PIDno PINID ParcelId PID_combine
# 1     a  <NA>     <NA>           a
# 2  <NA>     b     <NA>           b
# 3  <NA>  <NA>        c           c

答案 1 :(得分:2)

我们可以使用tidyverse。所选的列将与character转换为mutate_at,然后将coalesce中的那些列mutate

library(tidyverse)
sample %>%
    mutate_at(vars(matches("PID|PIN|Parcel")), as.character) %>% 
    mutate(new = coalesce(!!! select(., matches("PID|PIN|Parcel"))))
#    PIDno PINID ParcelId new
#1     a  <NA>     <NA>   a
#2  <NA>     b     <NA>   b
#3  <NA>  <NA>        c   c

答案 2 :(得分:0)

我可能正在拨错树,但是coalesce()函数的约定是,它从左到右返回参数列表中的第一个非NA值。因此,如果您使用以下代码:

sample$PID_combine = coalesce(sample$PIDno, sample$PINID, sample$ParcelId)

然后,该行为将是首先返回PIDno,如果该值不是NA,则返回PINID,然后依次返回ParcelID

对于您在问题中提供的示例输入数据,PID_combine的值为['a', 'b', 'c']