【问题标题】:R, extract columns as vectors from grouped data frameR,从分组数据框中提取列作为向量
【发布时间】:2018-08-28 21:12:21
【问题描述】:

假设你有这个数据框

x <- c("a1", "a2", "a3", "a4", "a1", "a2", "a3", "a4")

y <- c("red", "yellow", "blue", "green", "black", "pink", "purple", 
"orange")

df <- data.frame(x, y, stringsAsFactors = FALSE)

我想不出一种方法,最好是使用 dplyr,在对数据框进行分组后提取 y 列。本质上,我想知道 a1、a2、a3 和 a4 中的颜色,并将这些结果存储为单独的向量,最好是在列表中。

我可以的

colors.in.a1 <- df %>% filter(x == "a1") %>% pull(y)

对于 a1、a2、a3、a4 中的每一个,但我的真实数据需要一段时间。我希望pull() 的行为类似于tally(),可能会返回一个基于分组变量命名的向量列表,但事实并非如此。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    使用dplyrpurrr 的另一种解决方案:

    library(dplyr)
    library(purrr)
    
    df %>% 
      split(.$x) %>% 
      map(pull, y)
    
    $a1
    [1] "red"   "black"
    
    $a2
    [1] "yellow" "pink"  
    
    $a3
    [1] "blue"   "purple"
    
    $a4
    [1] "green"  "orange"
    

    数据:

    df <- structure(list(x = c("a1", "a2", "a3", "a4", "a1", "a2", "a3", 
    "a4"), y = c("red", "yellow", "blue", "green", "black", "pink", 
    "purple", "orange")), class = "data.frame", row.names = c(NA, 
    -8L))
    

    【讨论】:

    • 非常感谢!真的拯救了我的一天。
    【解决方案2】:

    仅使用 Base R(感谢@thelatemail 的评论):

    split(df$y, df$x)
    

    或者我们可以使用nest:

    library(tidyverse)
    
    df %>%
      group_by(x) %>%
      nest() %>%
      mutate(data = data %>% map(pull, y)) %>%
      pull(data) %>%
      setNames(unique(x))
    

    结果:

    $a1
    [1] "red"   "black"
    
    $a2
    [1] "yellow" "pink"  
    
    $a3
    [1] "blue"   "purple"
    
    $a4
    [1] "green"  "orange"
    

    【讨论】:

    • 如果你想让它可编程,为什么不只是 split(df$y, df$x)split(df[["y"]], df[["x"]])
    • @thelatemail 你说得对,我一直忘记split 也适用于分割向量。
    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多