tidyr separate_rows 与用户定义的函数? (r / tidyverse)
tidyr separate_rows with user defined function? (r / tidyverse)
separate_rows根据列值分成多行,重复其他列的值。
> t <- tibble(x = c("a,b", "c,d"), v = c(1,2))
> t %>% separate_rows(x, sep = ",")
# A tibble: 4 × 2
x v
<chr> <dbl>
1 a 1
2 b 1
3 c 2
4 d 2
但是,如果我想在它上面应用一个函数怎么办?例如,在分开之后,如果在 ("a", "b") 中,则将 x 的值更改为 true,否则为 false。
我知道我需要做的就是跟随 separate_rows 进行变异。我的问题是是否已经有一个函数可以分离和处理逗号分隔值。如何以与 separate_rows 类似的方式使用该函数? (原因是我想将复杂的拆分逻辑分离到一个函数中而不是在 mutate 中)
例如,下面的示例执行上面的逻辑和 return 值向量。是否可以作为单独的行执行类似的操作? (即拆分列并重复行值)
proc <- function(text){
text %>%
str_split(pattern = ",") %>%
unlist() %>%
sapply(function(x){
if(x %in% c("a", "b"))
return(T)
else
return(F)
})
}
有点
如果您将函数(此处 proc
)的输出保留为列表形式而不是 unlist
ing,则可以将该函数应用到 x
和 mutate
然后 unnest
x
。将其保持在列表形式会保留有关 proc(t$x)
的哪个元素对应于 t
的哪一行的信息,并且当您 unlist
.
时该信息将丢失
library(tidyr)
library(stringr)
library(dplyr, warn.conflicts = FALSE)
proc <- function(text) {
text %>%
str_split(pattern = ",") %>%
lapply(function(x) {
x %in% c("a", "b")
})
}
t <- tibble(x = c("a,b", "c,d"), v = c(1,2))
t %>%
mutate(x = proc(x)) %>%
unnest(x)
#> # A tibble: 4 × 2
#> x v
#> <lgl> <dbl>
#> 1 TRUE 1
#> 2 TRUE 1
#> 3 FALSE 2
#> 4 FALSE 2
由 reprex package (v2.0.1)
于 2022-02-20 创建
但是,如果您无论如何都要使用两个函数(mutate
和 unnest
),您最好先使用 separate_rows
,然后再使用 mutate
。
或者,您可以将所有内容打包到 proc
函数中。
library(tidyr)
library(stringr)
library(dplyr, warn.conflicts = FALSE)
proc <- function(df, col) {
fun <- function(text) {
text %>%
str_split(pattern = ",") %>%
lapply(function(x) {
x %in% c("a", "b")
})
}
df %>%
mutate(across({{ col }}, fun)) %>%
unnest({{ col }})
}
t <- tibble(x = c("a,b", "c,d"), v = c(1,2))
t %>%
proc(x)
#> # A tibble: 4 × 2
#> x v
#> <lgl> <dbl>
#> 1 TRUE 1
#> 2 TRUE 1
#> 3 FALSE 2
#> 4 FALSE 2
由 reprex package (v2.0.1)
于 2022-02-20 创建
separate_rows根据列值分成多行,重复其他列的值。
> t <- tibble(x = c("a,b", "c,d"), v = c(1,2))
> t %>% separate_rows(x, sep = ",")
# A tibble: 4 × 2
x v
<chr> <dbl>
1 a 1
2 b 1
3 c 2
4 d 2
但是,如果我想在它上面应用一个函数怎么办?例如,在分开之后,如果在 ("a", "b") 中,则将 x 的值更改为 true,否则为 false。
我知道我需要做的就是跟随 separate_rows 进行变异。我的问题是是否已经有一个函数可以分离和处理逗号分隔值。如何以与 separate_rows 类似的方式使用该函数? (原因是我想将复杂的拆分逻辑分离到一个函数中而不是在 mutate 中)
例如,下面的示例执行上面的逻辑和 return 值向量。是否可以作为单独的行执行类似的操作? (即拆分列并重复行值)
proc <- function(text){
text %>%
str_split(pattern = ",") %>%
unlist() %>%
sapply(function(x){
if(x %in% c("a", "b"))
return(T)
else
return(F)
})
}
有点
如果您将函数(此处 proc
)的输出保留为列表形式而不是 unlist
ing,则可以将该函数应用到 x
和 mutate
然后 unnest
x
。将其保持在列表形式会保留有关 proc(t$x)
的哪个元素对应于 t
的哪一行的信息,并且当您 unlist
.
library(tidyr)
library(stringr)
library(dplyr, warn.conflicts = FALSE)
proc <- function(text) {
text %>%
str_split(pattern = ",") %>%
lapply(function(x) {
x %in% c("a", "b")
})
}
t <- tibble(x = c("a,b", "c,d"), v = c(1,2))
t %>%
mutate(x = proc(x)) %>%
unnest(x)
#> # A tibble: 4 × 2
#> x v
#> <lgl> <dbl>
#> 1 TRUE 1
#> 2 TRUE 1
#> 3 FALSE 2
#> 4 FALSE 2
由 reprex package (v2.0.1)
于 2022-02-20 创建但是,如果您无论如何都要使用两个函数(mutate
和 unnest
),您最好先使用 separate_rows
,然后再使用 mutate
。
或者,您可以将所有内容打包到 proc
函数中。
library(tidyr)
library(stringr)
library(dplyr, warn.conflicts = FALSE)
proc <- function(df, col) {
fun <- function(text) {
text %>%
str_split(pattern = ",") %>%
lapply(function(x) {
x %in% c("a", "b")
})
}
df %>%
mutate(across({{ col }}, fun)) %>%
unnest({{ col }})
}
t <- tibble(x = c("a,b", "c,d"), v = c(1,2))
t %>%
proc(x)
#> # A tibble: 4 × 2
#> x v
#> <lgl> <dbl>
#> 1 TRUE 1
#> 2 TRUE 1
#> 3 FALSE 2
#> 4 FALSE 2
由 reprex package (v2.0.1)
于 2022-02-20 创建