在 tibble 的不同级别应用功能
Apply function at different levels of a tibble
我有以下问题:
library(tidyverse)
set.seed(1234)
df <- tibble(
x1 = letters[1:2],
y1 = list(
tibble(
x2 = letters[3:4],
y2 = list(
tibble(
x3 = seq(1, 100, 1),
y3 = rnorm(100)
)
)
)
)
)
我需要访问包含 x3
和 y3
的 tibble 中的 tibble 并将自定义函数应用于每个数据框。为简单起见,假设我需要将 base::mean()
应用于 y3
。
我的真实数据比这大得多,所以我正在寻找一种干净高效的方法。有什么想法吗?
你需要找到你想要应用函数的级别(我通过括号索引来实现),然后应用函数。我希望这可以转移到您需要做的事情上。
> df[["y1"]][[1]][[2]] %>% lapply(., function(x){mean(x$y3)})
[[1]]
[1] 0.04124318
[[2]]
[1] 0.04124318
你能把你的巢穴打开吗?
df %>% unnest() %>% unnest() %>%
group_by(x2) %>%
summarise(mean(y3))
# A tibble: 2 x 2
x2 `mean(y3)`
<chr> <dbl>
1 c -0.157
2 d -0.157
不确定您希望最终数据框的外观如何,但这里有另一个建议
df %>% unnest() %>%
mutate(y3.average = map(y2, ~mean(.$y3)) ) %>%
unnest(y3.average)
# A tibble: 4 x 4
x1 x2 y2 y3.average
<chr> <chr> <list> <dbl>
1 a c <tibble [100 × 2]> -0.157
2 a d <tibble [100 × 2]> -0.157
3 b c <tibble [100 × 2]> -0.157
4 b d <tibble [100 × 2]> -0.157
我有以下问题:
library(tidyverse)
set.seed(1234)
df <- tibble(
x1 = letters[1:2],
y1 = list(
tibble(
x2 = letters[3:4],
y2 = list(
tibble(
x3 = seq(1, 100, 1),
y3 = rnorm(100)
)
)
)
)
)
我需要访问包含 x3
和 y3
的 tibble 中的 tibble 并将自定义函数应用于每个数据框。为简单起见,假设我需要将 base::mean()
应用于 y3
。
我的真实数据比这大得多,所以我正在寻找一种干净高效的方法。有什么想法吗?
你需要找到你想要应用函数的级别(我通过括号索引来实现),然后应用函数。我希望这可以转移到您需要做的事情上。
> df[["y1"]][[1]][[2]] %>% lapply(., function(x){mean(x$y3)})
[[1]]
[1] 0.04124318
[[2]]
[1] 0.04124318
你能把你的巢穴打开吗?
df %>% unnest() %>% unnest() %>%
group_by(x2) %>%
summarise(mean(y3))
# A tibble: 2 x 2
x2 `mean(y3)`
<chr> <dbl>
1 c -0.157
2 d -0.157
不确定您希望最终数据框的外观如何,但这里有另一个建议
df %>% unnest() %>%
mutate(y3.average = map(y2, ~mean(.$y3)) ) %>%
unnest(y3.average)
# A tibble: 4 x 4
x1 x2 y2 y3.average
<chr> <chr> <list> <dbl>
1 a c <tibble [100 × 2]> -0.157
2 a d <tibble [100 × 2]> -0.157
3 b c <tibble [100 × 2]> -0.157
4 b d <tibble [100 × 2]> -0.157