我想用dplyr
?
我有以下嵌套数据框:
library(dplyr)
# Initialise nested data frame
d <- tibble(group = c("A", "B"),
data = rep(list(NA), 2))
set.seed(1)
d$data[[1]] <- data.frame(x = seq(1:10),
y = rnorm(10))
d$data[[2]] <- data.frame(x = seq(1:15),
y = rnorm(15),
z = runif(15))
假设我只希望group == "A"
数据框中的行y >= 0
,而group == B
的数据框保持不变。 编辑: 操作后,两个结果数据框应具有相同的变量。
我正在考虑执行类似下面的行,但结合mutate命令,但filter(y >= 0)
在这里不起作用。那么,我该怎么做呢?
d %>% filter(group == "A") %>% select(data) %>% filter(y >= 0)
答案 0 :(得分:2)
您希望filter
基于两个变量(group
和y
)。但是,其中一个变量(y
)是嵌套变量(data
)的一部分。如果您首先filter
数据,则可以通过unnest
更轻松地访问这两个变量。如果确实需要,您可以再次nest
您的数据。
library(tidyverse)
# Initialise nested data frame
d <- tibble(group = c("A", "B"),
data = rep(list(NA), 2))
set.seed(1)
d$data[[1]] <- data.frame(x = seq(1:10),
y = rnorm(10))
d$data[[2]] <- data.frame(x = seq(1:15),
y = rnorm(15),
z = runif(15))
d %>%
unnest() %>% # unnest data
filter(!(group == "A" & y < 0)) %>% # exclude rows where y < 0 for group A
group_by(group) %>% # for each group
nest() # nest data
# # A tibble: 2 x 2
# group data
# <chr> <list>
# 1 A <tibble [6 x 3]>
# 2 B <tibble [15 x 3]>
答案 1 :(得分:2)
我们可以通过filter
map2
来完成
library(tidyverse)
d %>%
mutate(data = map2(group, data, ~
.y %>%
filter(!(.x == "A" & y < 0))))
# A tibble: 2 x 2
# group data
# <chr> <list>
#1 A <data.frame [6 × 2]>
#2 B <data.frame [15 × 3]>
使用反向比较,它将是
out <- d %>%
mutate(data = map2(group, data, ~
.y %>%
filter((.x == "A" & y >=0)|.x != "A")))
out
# A tibble: 2 x 2
# group data
# <chr> <list>
#1 A <data.frame [6 × 2]>
#2 B <data.frame [15 × 3]>
map(d$data, dim)
#[[1]]
#[1] 10 2
#[[2]]
#[1] 15 3
map(out$data, dim)
#[[1]]
#[1] 6 2
#[[2]]
#[1] 15 3