У меня есть функция, которая возвращает тиббл. Он работает нормально, но я хочу его векторизовать.
library(tidyverse)
tibTest <- tibble(argX = 1:4, argY = 7:4)
square_it <- function(xx, yy) {
if(xx >= 4){
tibble(x = NA, y = NA)
} else if(xx == 3){
tibble(x = as.integer(), y = as.integer())
} else if (xx == 2){
tibble(x = xx^2 - 1, y = yy^2 -1)
} else {
tibble(x = xx^2, y = yy^2)
}
}
Он работает нормально в mutate
, когда я вызываю его с помощью map2
, давая мне желаемый результат:
tibTest %>%
mutate(sq = map2(argX, argY, square_it)) %>%
unnest()
## A tibble: 3 x 4
# argX argY x y
# <int> <int> <dbl> <dbl>
# 1 1 7 1 49
# 2 2 6 3 35
# 3 4 4 NA NA
Моя первая попытка векторизовать его не удалась, и я понимаю, почему - я не могу вернуть вектор тибблей.
square_it2 <- function(xx, yy){
case_when(
x >= 4 ~ tibble(x = NA, y = NA),
x == 3 ~ tibble(x = as.integer(), y = as.integer()),
x == 2 ~ tibble(x = xx^2 - 1, y = yy^2 -1),
TRUE ~ tibble(x = xx^2, y = yy^2)
)
}
# square_it2(4, 2) # FAILS
Моя следующая попытка работает нормально на простом вводе. Я могу вернуть список блюд, и это то, что мне нужно для unnest
square_it3 <- function(xx, yy){
case_when(
xx >= 4 ~ list(tibble(x = NA, y = NA)),
xx == 3 ~ list(tibble(x = as.integer(), y = as.integer())),
xx == 2 ~ list(tibble(x = xx^2 - 1, y = yy^2 -1)),
TRUE ~ list(tibble(x = xx^2, y = yy^2))
)
}
square_it3(4, 2)
# [[1]]
# # A tibble: 1 x 2
# x y
# <lgl> <lgl>
# 1 NA NA
Но когда я вызываю его в mutate
, он не дает мне того результата, который был у меня с square_it
. Я вроде как вижу, что не так. В предложении xx == 2
xx
действует как атомарное значение 2. Но при построении тиббла xx
является вектором длины 4.
tibTest %>%
mutate(sq = square_it3(argX, argY)) %>%
unnest()
# # A tibble: 9 x 4
# argX argY x y
# <int> <int> <dbl> <dbl>
# 1 1 7 1 49
# 2 1 7 4 36
# 3 1 7 9 25
# 4 1 7 16 16
# 5 2 6 0 48
# 6 2 6 3 35
# 7 2 6 8 24
# 8 2 6 15 15
# 9 4 4 NA NA
Как мне получить тот же результат, что и с square_it
, но из векторизованной функции с использованием case_when
?
rowwise()
на тибле. - person 27 ϕ 9   schedule 16.05.2020tibTest %>% rowwise() %>% mutate(sq = square_it3(argX, argY)) %>% unnest()
сделал свое дело! - person David T   schedule 16.05.2020