【发布时间】:2020-04-17 17:46:55
【问题描述】:
我有一个如下所示的数据框:
df <-
structure(
list(
Exception1 = c(
"Comments from {2}: {0}",
"status updated to {1} by {2}. Description:{0}",
"status updated to {1} by {2}. Description:{0}",
"information only.",
"status updated to {1} by {2}. Description:{0}",
"status updated to {1} by {2}. Description:{0}"
),
Exception2 = c(
"Customer {0} said bla",
"Status updated to {1}",
"Customer said {2}",
"User {0} foo",
"{0} {1}",
"{1} {2}"
),
ARGUMENT1 = c("OK", " ", " ", "PAY9089723089-98391", " ", " "),
ARGUMENT2 = c(
"null",
"Processing",
"Reconciled",
"null",
"Processing",
"Reconciled"
),
ARGUMENT3 = c(
"company name",
"company name",
"company name",
"null",
"company name",
"company name"
)
),
row.names = c(NA, 6L),
class = "data.frame"
)
:
| Exception1 | Exception2 | ARGUMENT1 | ARGUMENT2 | ARGUMENT3 |
|-----------------------------------------------|-----------------------|---------------------|------------|--------------|
| Comments from {2}: {0} | Customer {0} said bla | OK | null | company name |
| status updated to {1} by {2}. Description:{0} | Status updated to {1} | | Processing | company name |
| status updated to {1} by {2}. Description:{0} | Customer said {2} | | Reconciled | company name |
| information only. | User {0} foo | PAY9089723089-98391 | null | null |
| status updated to {1} by {2}. Description:{0} | {0} {1} | | Processing | company name |
| status updated to {1} by {2}. Description:{0} | {1} {2} | | Reconciled | company name |
Exception1 和 Exception 2 列(为了便于阅读,我删除了另外几个 Exception 列)包含用于替换为 ARGUMENT* 列中的值的占位符 {}。
我一直在寻找实现这一目标的方法,并且相对成功,但我仍然缺乏做得更好的经验。
我写了一个简单的函数,通过 gsub 进行替换:
excp_ren2 <- function(x) {
x %<>%
gsub("\\{1\\}", x["ARGUMENT2"], .) %>%
gsub("\\{0\\}", x["ARGUMENT1"], .) %>%
gsub("\\{2\\}", x["ARGUMENT3"], .)
x
}
然后一直在使用 apply 及其差异。例如,我已经完成了一个 OK 的结果:
new_df <-
df %>% apply(
.,
MARGIN = 1,
FUN = function(x)
excp_ren2(x)
) %>% as.data.frame()
唯一的问题是这会转置矩阵,这并不是真正的问题。
我正在寻找更好的方法来做到这一点,我以为我可以通过 mutate_* 做到这一点,但我认为我无法访问函数内行的列名,或者至少我不知道怎么做。关于更简单的方法来实现这一点的任何想法?
谢谢!
【问题讨论】:
-
您在所有列上都使用
apply和MARGIN = 1。我猜你只对第一列感兴趣Exception1) 在这种情况下,只需在该列上应用函数