【发布时间】:2020-04-04 05:27:21
【问题描述】:
我正在尝试使用自定义函数,它过滤数据框并从另一列中提取信息,在 dplyr::mutate 和 dplyr version 0.8.3 内。我收到两种类型的错误。一个大数据框产生Error: Result must have length 32, not 1728 作为错误,另一个在以下示例代码中使用,不返回错误消息但返回错误匹配。
查找数据框
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)
终端运行
从终端运行函数确实会返回预期的结果。
> lookup_function("dk")
[1] "four"
> lookup_function("el")
[1] "five"
dplyr::mutate 运行
在 dplyr::mutate 中对不同的数据帧运行相同的函数不会返回预期的结果。
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
代码应该,至少在这个例子中,应该返回 lookup.df 的匹配列,但相反,而是在每一行中返回 four。
向量通过 Sapply
当通过sapply 进行管道传输时,该函数似乎确实返回了适当的结果。
c("dk","el") %>% sapply(lookup_function)
dk el
"four" "five"
我几乎不熟悉此类使用的自定义函数矢量化,所以我不确定这是否是此错误的根源。
修复此自定义函数以使其从查找数据帧返回正确信息的正确方法是什么?
【问题讨论】:
标签: r dataframe dplyr custom-function