2つの列GL
とGLDESC
のデータフレームがあり、列KIND
の内部にあるデータに基づいて、GLDESC
と呼ばれる3番目の列を追加します。
データフレームは次のとおりです。
GL GLDESC
1 515100 Payroll-Indir Salary Labor
2 515900 Payroll-Indir Compensated Absences
3 532300 Bulk Gas
4 539991 Area Charge In
5 551000 Repairs & Maint-Spare Parts
6 551100 Supplies-Operating
7 551300 Consumables
データテーブルの各行について:
GLDESC
に単語Payroll
が含まれている場合、KIND
をPayroll
にしたいGLDESC
に単語Gas
が文字列のどこかに含まれている場合、KIND
をMaterials
にしたいKIND
をOther
にしたい私はstackoverflowで同様の例を探しましたが見つかりませんでした。また、R
を調べて、スイッチ、grep、apply、および正規表現のダミーを探し、GLDESC
列の一部のみを検索して照合しました。 KIND
列にアカウントの種類を入力しますが、機能させることができませんでした。
条件が2つしかないため、ネストされたifelse
を使用できます。
#random data; it wasn't easy to copy-paste yours
DF <- data.frame(GL = sample(10), GLDESC = paste(sample(letters, 10),
c("gas", "payroll12", "GaSer", "asdf", "qweaa", "PayROll-12",
"asdfg", "GAS--2", "fghfgh", "qweee"), sample(letters, 10), sep = " "))
DF$KIND <- ifelse(grepl("gas", DF$GLDESC, ignore.case = T), "Materials",
ifelse(grepl("payroll", DF$GLDESC, ignore.case = T), "Payroll", "Other"))
DF
# GL GLDESC KIND
#1 8 e gas l Materials
#2 1 c payroll12 y Payroll
#3 10 m GaSer v Materials
#4 6 t asdf n Other
#5 2 w qweaa t Other
#6 4 r PayROll-12 q Payroll
#7 9 n asdfg a Other
#8 5 d GAS--2 w Materials
#9 7 s fghfgh e Other
#10 3 g qweee k Other
[〜#〜]編集[〜#〜]10/3/2016 (..予想以上の注意を受けた後)
より多くのパターンを処理するための可能な解決策は、すべてのパターンを反復処理し、一致がある場合は常に比較の量を徐々に減らすことです。
ff = function(x, patterns, replacements = patterns, fill = NA, ...)
{
stopifnot(length(patterns) == length(replacements))
ans = rep_len(as.character(fill), length(x))
empty = seq_along(x)
for(i in seq_along(patterns)) {
greps = grepl(patterns[[i]], x[empty], ...)
ans[empty[greps]] = replacements[[i]]
empty = empty[!greps]
}
return(ans)
}
ff(DF$GLDESC, c("gas", "payroll"), c("Materials", "Payroll"), "Other", ignore.case = TRUE)
# [1] "Materials" "Payroll" "Materials" "Other" "Other" "Payroll" "Other" "Materials" "Other" "Other"
ff(c("pat1a pat2", "pat1a pat1b", "pat3", "pat4"),
c("pat1a|pat1b", "pat2", "pat3"),
c("1", "2", "3"), fill = "empty")
#[1] "1" "1" "3" "empty"
ff(c("pat1a pat2", "pat1a pat1b", "pat3", "pat4"),
c("pat2", "pat1a|pat1b", "pat3"),
c("2", "1", "3"), fill = "empty")
#[1] "2" "1" "3" "empty"