簡體   English   中英

聚合數據框每一列的所有唯一值

[英]Aggregating all unique values of each column of data frame

我有一個大數據框(1616610 行,255 列),我需要根據一個鍵將每列的唯一值粘貼在一起。

例如:

> data = data.frame(a=c(1,1,1,2,2,3),
              b=c("apples", "oranges", "apples", "apples", "apples", "grapefruit"),
              c=c(12, 22, 22, 45, 67, 28), 
              d=c("Monday", "Monday", "Monday", "Tuesday", "Wednesday", "Tuesday"))
> data
  a          b  c         d
1 1     apples 12    Monday
2 1    oranges 22    Monday
3 1     apples 22    Monday
4 2     apples 45   Tuesday
5 2     apples 67 Wednesday
6 3 grapefruit 28   Tuesday

我需要的是聚合 255 列中的每一個中的每個唯一值,並為每個唯一值返回一個帶有逗號分隔符的新數據框。 像這樣:

  a               b      c                  d
1 1 apples, oranges 12, 22             Monday
2 2          apples 45, 67 Tuesday, Wednesday
3 3      grapefruit     28           Thursday

我嘗試過使用aggregate ,如下所示:

output <- aggregate(data, by=list(data$a), paste, collapse=", ")

但是對於這種大小的數據框,它太耗費時間(幾個小時),而且我經常不得不一起殺死這個進程。 最重要的是,這將聚合所有值,而不僅僅是唯一值。 有沒有人有任何提示:

1)對於大型數據集如何提高這種聚合的時間

2)然后獲取每個字段的唯一值

順便說一句,這是我關於 SO 的第一篇文章,所以感謝您的耐心等待。

移自評論:

library(data.table)

dt <- as.data.table(data)
dt[, lapply(.SD, function(x) toString(unique(x))), by = a]

給予:

   a               b      c                  d
1: 1 apples, oranges 12, 22             Monday
2: 2          apples 45, 67 Tuesday, Wednesday
3: 3      grapefruit     28            Tuesday

您可以使用dplyr執行以下操作

編輯 1

更新的答案消除了使用 summarise_each 引起的棄用警告(從summarise_each 0.7.0 開始)。 這使用summarise & across而不是summarise_each

library(dplyr)

func_paste <- function(x) paste(unique(x), collapse = ', ')
data %>%
  group_by(a) %>%
  summarise(across(everything(), func_paste))

# Without "func_paste", using paste directly (from Alistaire's comment).
data %>%
  group_by(a) %>%
  summarise(across(everything(), ~ paste(unique(.), collapse = ', ')))

## # A tibble: 3 × 4
##       a b               c      d
##   <dbl> <chr>           <chr>  <chr>
## 1     1 apples, oranges 12, 22 Monday
## 2     2 apples          45, 67 Tuesday, Wednesday
## 3     3 grapefruit      28     Tuesday

上一個答案,這將導致不推薦使用的警告(從 dplyr 0.7.0 開始)

func_paste <- function(x) paste(unique(x), collapse = ', ')
data %>%
    group_by(a) %>%
    summarise_each(funs(func_paste))

##      a               b      c                  d
##  (dbl)           (chr)  (chr)              (chr)
##1     1 apples, oranges 12, 22             Monday
##2     2          apples 45, 67 Tuesday, Wednesday
##3     3      grapefruit     28            Tuesday

# Without "func_paste", using paste directly (from Alistaire's comment).
data %>%
  group_by(a) %>%
  summarise_each(funs(paste(unique(.), collapse = ', ')))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM