【问题标题】:How to extract first value from lists in data.frames columns?如何从 data.frames 列中的列表中提取第一个值?
【发布时间】:2021-02-16 05:42:33
【问题描述】:

这个问题类似于R: How to extract a list from a dataframe? 但我无法以简单的方式将其应用于我的问题。

weird_df <- data_frame(col1 =c('hello', 'world', 'again'),col_weird = list(list(12,23), list(23,24), NA),col_weird2 = list(list(0,45), list(4,45),list(45,45.45,23)))
weird_df
# A tibble: 3 x 3
  col1  col_weird  col_weird2
  <chr> <list>     <list>    
1 hello <list [2]> <list [2]>
2 world <list [2]> <list [2]>
3 again <lgl [1]>  <list [3]>
> 

我希望在 col_weirdcol_weird2 列中仅显示当前列表的第一个值。

col1  col_weird  col_weird2   
1 hello 12       0
2 world 23       4
3 again NA      45

我真正的问题有很多专栏。我试过这个(在发布的链接中更改了接受答案)

library(tidyr)
library(purrr)

weird_df %>%
     mutate(col_weird = map(c(col_weird,col_weird2), toString ) ) %>%
     separate(col_weird, into = c("col1"), convert = TRUE) %>%
     separate(col_weird2, into = c("col2",convert = T)

【问题讨论】:

  • 我不知道函数data_frame(),你是说data.frame()吗?此外,data.frame() 的行为也有所不同。 data_frame() 来自哪个包?
  • 实际上我从提到的链接中获得了它。下划线data_frame 是正确的,因为它应该会产生一个小标题。使用data.frame 会生成一个data.frame。

标签: r list dataframe dplyr


【解决方案1】:

这是dplyr 解决方案

library(dplyr)
weird_df %>% mutate(across(c(col_weird, col_weird2), ~vapply(., `[[`, numeric(1L), 1L)))

输出

# A tibble: 3 x 3
  col1  col_weird col_weird2
  <chr>     <dbl>      <dbl>
1 hello        12          0
2 world        23          4
3 again        NA         45

【讨论】:

    【解决方案2】:

    一种解决方案是编写一个简单的函数,从列表向量中的每个列表中提取第一个值。然后,您可以将其应用于数据框中的相关列。

    library(tibble)
    
    #create data
    weird_df <- tibble(col1 =c('hello', 'world', 'again'),
                       col_weird = list(list(12,23), list(23,24), NA),
                       col_weird2 = list(list(0,45), list(4,45), list(45,45.45,23)))
    
    #function to extract first values from a vector of lists
    fnc <- function(x) {
      sapply(x, FUN = function(y) {y[[1]]})
    }
    
    #apply function to the relevant columns
    weird_df[,2:3] <- apply(weird_df[,2:3], MARGIN = 2, FUN = fnc)
    
    weird_df
    
    # A tibble: 3 x 3
      col1  col_weird col_weird2
      <chr>     <dbl>      <dbl>
    1 hello        12          0
    2 world        23          4
    3 again        NA         45
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-13
      • 2017-06-10
      • 1970-01-01
      • 2017-12-12
      • 2019-09-27
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多