我在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')
答案 0 :(得分:3)
这就是我要怎么做。
"sample$PIDno"
作为字符串使用-这毫无用处。只需将列名称作为字符串即可。coalesce
。这很容易写,然后我们就可以... 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']
。