R 中的自定义查找函数在 R 中的 dplyr::mutate 中不起作用
Custom lookup function in R not working within dplyr::mutate in R
我正在尝试使用自定义函数,该函数过滤数据框并从 dplyr::mutate
和 dplyr version 0.8.3
中的另一列中提取信息。我收到两种类型的错误。一个具有大数据帧的错误会产生 Error: Result must have length 32, not 1728
,另一个在以下示例代码中使用,不会 return 错误消息,而是 return 错误匹配。
查找数据框
lookup.df<-data.frame(to.match=paste(letters[1:7],letters[8:14],sep = ""),
match=c("one","two","three","four","five","six","seven"))
lookup.df
to.match match
1 ah one
2 bi two
3 cj three
4 dk four
5 el five
6 fm six
7 gn seven
查找函数
lookup_function<-function(x){
y<-lookup.df %>%
mutate_all(as.character) %>%
filter(to.match==x) %>%
pull(match)
y
}
Vectorize(lookup_function)
航站楼运行
运行从终端执行该功能会 return 预期的结果。
> lookup_function("dk")
[1] "four"
> lookup_function("el")
[1] "five"
dplyr::mutate 运行
运行将相同的函数应用于 dplyr::mutate 中的不同数据帧不会 return 预期的结果。
live.df<-data.frame(to.match=rev(paste(letters[1:7],letters[8:14],sep = "")))
live.df %>%
mutate(live.match=lookup_function(to.match))
to.match live.match
1 gn four
2 fm four
3 el four
4 dk four
5 cj four
6 bi four
7 ah four
代码应该,在这个例子中至少,应该return lookup.df 的匹配列,但反过来却相反 returns four
每行。
通过 Sapply 向量
当通过 sapply
.
时,该函数似乎确实 return 了适当的结果
c("dk","el") %>% sapply(lookup_function)
dk el
"four" "five"
我几乎不熟悉此类用途的自定义函数的矢量化,所以我不确定这是否是此错误的根源。
修复此自定义函数以使其return从查找数据帧中获取正确信息的正确方法是什么?
关于将 OP 的函数与 Vectorize
一起使用,该函数将更新为 lookup_function <- Vectorize(lookup_function)
,然后应用 OP 的 post 中的代码,或者即时执行此操作
library(dplyr)
live.df %>%
mutate(live.match=Vectorize(lookup_function)(to.match))
# to.match live.match
#1 gn seven
#2 fm six
#3 el five
#4 dk four
#5 cj three
#6 bi two
#7 ah one
但是,它会很低效,因为它会过滤每个匹配项 (filter(to.match==x)
),这是低效的
我们可以使用 left_join
library(dplyr)
live.df %>%
left_join(lookup.df)
或使用match
live.df %>%
mutate(match = lookup.df$match[match(to.match, lookup.df$to.match)])
也可用于base R
live.df$match <- with(live.df, lookup.df$match[match(to.match, lookup.df$to.match)])
我正在尝试使用自定义函数,该函数过滤数据框并从 dplyr::mutate
和 dplyr version 0.8.3
中的另一列中提取信息。我收到两种类型的错误。一个具有大数据帧的错误会产生 Error: Result must have length 32, not 1728
,另一个在以下示例代码中使用,不会 return 错误消息,而是 return 错误匹配。
查找数据框
lookup.df<-data.frame(to.match=paste(letters[1:7],letters[8:14],sep = ""),
match=c("one","two","three","four","five","six","seven"))
lookup.df
to.match match
1 ah one
2 bi two
3 cj three
4 dk four
5 el five
6 fm six
7 gn seven
查找函数
lookup_function<-function(x){
y<-lookup.df %>%
mutate_all(as.character) %>%
filter(to.match==x) %>%
pull(match)
y
}
Vectorize(lookup_function)
航站楼运行
运行从终端执行该功能会 return 预期的结果。
> lookup_function("dk")
[1] "four"
> lookup_function("el")
[1] "five"
dplyr::mutate 运行
运行将相同的函数应用于 dplyr::mutate 中的不同数据帧不会 return 预期的结果。
live.df<-data.frame(to.match=rev(paste(letters[1:7],letters[8:14],sep = "")))
live.df %>%
mutate(live.match=lookup_function(to.match))
to.match live.match
1 gn four
2 fm four
3 el four
4 dk four
5 cj four
6 bi four
7 ah four
代码应该,在这个例子中至少,应该return lookup.df 的匹配列,但反过来却相反 returns four
每行。
通过 Sapply 向量
当通过 sapply
.
c("dk","el") %>% sapply(lookup_function)
dk el
"four" "five"
我几乎不熟悉此类用途的自定义函数的矢量化,所以我不确定这是否是此错误的根源。
修复此自定义函数以使其return从查找数据帧中获取正确信息的正确方法是什么?
关于将 OP 的函数与 Vectorize
一起使用,该函数将更新为 lookup_function <- Vectorize(lookup_function)
,然后应用 OP 的 post 中的代码,或者即时执行此操作
library(dplyr)
live.df %>%
mutate(live.match=Vectorize(lookup_function)(to.match))
# to.match live.match
#1 gn seven
#2 fm six
#3 el five
#4 dk four
#5 cj three
#6 bi two
#7 ah one
但是,它会很低效,因为它会过滤每个匹配项 (filter(to.match==x)
),这是低效的
我们可以使用 left_join
library(dplyr)
live.df %>%
left_join(lookup.df)
或使用match
live.df %>%
mutate(match = lookup.df$match[match(to.match, lookup.df$to.match)])
也可用于base R
live.df$match <- with(live.df, lookup.df$match[match(to.match, lookup.df$to.match)])