如何从 mutate 中的嵌套 tibble 中提取值?

How to extract value from nested tibble in mutate?

我有一个问题:

library(dplyr)
my_tib <- tibble(names = c("blah", "blah2"), data = list(1, c(2, 3)))

看起来像这样:

  names data     
  <chr> <list>   
1 blah  <dbl [1]>
2 blah2 <dbl [2]>

现在我想从 mutate 子句中提取数据列的第一个元素,条件是 data 条目的第一个元素是 <10 还是 >10:

my_tib %>%
  rowwise() %>%
  mutate(data_min = case_when(lengths(data) == 2 ~ data[[1]],
                              lengths(data) == 1 & data[[1]] > 10 ~ NA_integer_,
                              lengths(data) == 1 & data[[1]] < 10 ~ data[[1]]))

当我运行这个时,我得到以下错误:

Error in `mutate()`:
! Problem while computing `data_min = case_when(...)`.
✖ `data_min` must be size 1, not 2.
ℹ Did you mean: `data_min = list(case_when(...))` ?
ℹ The error occurred in row 2.
Run `rlang::last_error()` to see where the error occurred.

我想得到的是

  names data       data_min
  <chr> <list>     <int>
1 blah  <dbl [1]>  1
2 blah2 <dbl [2]>  2

我看过 here,但这对我的特殊情况没有帮助。

这可以在一个稍微更紧凑的选项中完成,即使用 map 遍历列表列并获得 first 观察结果,然后使用 case_when 更改 'data_min' 大于 10 并且当 lengths 不是 1 到 NA

library(purrr)
library(dplyr)
my_tib %>% 
  mutate(data_min = map_dbl(data, first), 
         data_min = case_when(lengths(data) == 1|data_min <10 ~ data_min))

在 OP 的代码中,lengths(data) return 1 和 1 as data 的长度是 list。相反,必须提取元素

my_tib %>%
  rowwise() %>%
  mutate(data_min = case_when(lengths(data[[1]]) == 2 
    ~ data[[1]][1],
           lengths(data[[1]]) == 1 & data[[1]][1] > 10 ~ NA_real_,
             lengths(data[[1]]) == 1 & data[[1]][1] < 10 ~ data[[1]][1]))

-输出

# A tibble: 2 × 3
# Rowwise: 
  names data      data_min
  <chr> <list>       <dbl>
1 blah  <dbl [1]>        1
2 blah2 <dbl [2]>        2