【问题标题】:Group dataframe by using a row in r使用 r 中的一行对数据框进行分组
【发布时间】:2019-01-13 10:47:28
【问题描述】:

我想使用某一行对我的数据框进行分组。例如,如果我有以下数据框;

Client  A  A  A  A  A  B  B  B  B  B
Figure 33 45 66 77 88 99 55 66 55 22

我想用Client分割数据框,这样生成的数据框如下;

Client  A  A  A  A  A
Figure 33 45 66 77 88

Client  B  B  B  B  B
Figure 99 55 66 55 22

我尝试使用data <- split( df , f = df$Client ),但这要求数据是垂直的而不是水平的,结果将是一个列表而不是一个数据框。我希望客户拆分的最后一组数据像我所指出的那样位于彼此下方,并且它是一个数据框,这样我就可以将其导出到 excel 中

【问题讨论】:

标签: r dplyr tidyverse data-manipulation


【解决方案1】:

检查这个解决方案:

library(tidyverse)

df %>%
  t() %>%
  as_tibble() %>%
  split(.$V1) %>%
  map(t)

【讨论】:

    【解决方案2】:

    这是base 解决方案

    clientVec <- unique(df['client',])
    # with lapply
    out <- lapply(seq_along(clientVec), function (k) df[,df['client',] == clientVec[k]])
    out
    # [[1]]
    #        [,1] [,2] [,3] [,4]
    # client "A"  "A"  "A"  "A" 
    # figure "36" "81" "47" "90"
    # 
    # [[2]]
    #        [,1] [,2] [,3] [,4]
    # client "B"  "B"  "B"  "B" 
    # figure "95" "14" "58" "91"
    

    如果您想要一个数据框,那么只需使用do.call(rbind, ...)

    do.call(rbind, out)
    #        [,1] [,2] [,3] [,4]
    # client "A"  "A"  "A"  "A" 
    # figure "36" "81" "47" "90"
    # client "B"  "B"  "B"  "B" 
    # figure "95" "14" "58" "91"
    

    数据

    set.seed(123)
    df <- t(data.frame(client = rep(LETTERS[1:2],c(4L,4L)), figure = sample(10:100, 8L, replace = TRUE)))
    #        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    # client "A"  "A"  "A"  "A"  "B"  "B"  "B"  "B" 
    # figure "36" "81" "47" "90" "95" "14" "58" "91"
    

    【讨论】:

      【解决方案3】:

      另一种基础 R 解决方案。我们可以根据Client 行拆分数据框的列名,然后使用它从原始数据框中选择列。最终结果是dat_list

      虽然可能不相关,但我想指出的是,您的数据框的格式并不常见,因为所有列都是字符。似乎Client 行是您的数据框的列名,但是由于您提到ClientFigure 是行名,并且列名通常不重复Client 行不能是列名字。

      dat_list <- lapply(split(names(dat), unlist(dat[1, ])), function(x) dat[, x])
      
      dat_list
      # $A
      #        V1 V2 V3 V4 V5
      # Client  A  A  A  A  A
      # Figure 33 45 66 77 88
      # 
      # $B
      #        V6 V7 V8 V9 V10
      # Client  B  B  B  B   B
      # Figure 99 55 66 55  22
      

      数据数据

      dat <- read.table(text = "A  A  A  A  A  B  B  B  B  B
      33 45 66 77 88 99 55 66 55 22",
                        header = FALSE, stringsAsFactors = FALSE)
      
      row.names(dat) <- c("Client", "Figure")
      

      【讨论】:

        【解决方案4】:

        类似于 Pawel Chabros 的回答,但根据要求将列表的结果元素组合成一个矩阵:

        df %>%
          t() %>%
          as_tibble() %>%
          split(.$Client) %>%
          map(t) %>% 
          reduce(rbind)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多