【问题标题】:Create a list of all values of a variable grouped by another variable in R创建由 R 中的另一个变量分组的变量的所有值的列表
【发布时间】:2018-04-29 01:39:14
【问题描述】:

我有一个包含两个变量的数据框,如下所示:

df <- data.frame(group=c(1,1,1,2,2,3,3,4),
                  type=c("a","b","a", "b", "c", "c","b","a"))

> df
   group type
1      1    a
2      1    b
3      1    a
4      2    b
5      2    c
6      3    c
7      3    b
8      4    a

我想为每个组生成一个表格,将其在数据框中的类型组合显示为一个变量,例如

  group alltypes
1     1     a, b
2     2     b, c
3     3     b, c
4     4        a

输出将始终以相同的顺序列出类型(例如,第 2 组和第 3 组得到相同的结果)并且不会重复(例如,第 1 组不是“a、b、a”)。

我尝试使用 dplyr 执行此操作并总结,但我不知道如何让它满足这两个条件 - 我尝试的代码是:

> df %>%
+   group_by(group) %>%
+   summarise(
+     alltypes = paste(type, collapse=", ")
+   )
# A tibble: 4 × 2
  group alltypes
  <dbl>    <chr>
1     1  a, b, a
2     2     b, c
3     3     c, b
4     4        a

我也尝试将类型转换为一组单独的计数,但不确定这是否真的有用:

> df %>%
+   group_by(group, type) %>%
+   tally %>%
+   spread(type, n, fill=0)
Source: local data frame [4 x 4]
Groups: group [4]

  group     a     b     c
* <dbl> <dbl> <dbl> <dbl>
1     1     2     1     0
2     2     0     1     1
3     3     0     1     1
4     4     1     0     0

任何建议将不胜感激。

【问题讨论】:

  • 尝试将 sort(unique(type)) 添加到您的第一个解决方案的粘贴调用中。
  • 这次看起来没有问题,但为了将来参考,请包含创建数据集的代码(就像我添加的一样)并省略&gt;和+控制台字符,以便有人可以复制并粘贴您的示例代码来运行它。

标签: r dplyr


【解决方案1】:

我认为你非常接近。您可以调用sort 和unique 函数来确保您的结果符合您的条件,如下所示:

df %>% group_by(group) %>% 
summarize(type = paste(sort(unique(type)),collapse=", "))

返回:

# A tibble: 4 x 2
  group  type
  <int> <chr>
1     1  a, b
2     2  b, c
3     3  b, c
4     4     a

【讨论】:

    【解决方案2】:

    为了扩展弗洛里安的回答,这可以扩展到根据数据集中的值生成有序列表。一个例子可以是确定日期的顺序:

    library(lubridate)
    library(tidyverse)
    
    # Generate random dates
    set.seed(123)
    Date = ymd("2018-01-01") + sort(sample(1:200, 10))
    A = ymd("2018-01-01") + sort(sample(1:200, 10))
    B = ymd("2018-01-01") + sort(sample(1:200, 10))
    C = ymd("2018-01-01") + sort(sample(1:200, 10))
    
    # Combine to data set
    data = bind_cols(as.data.frame(Date), as.data.frame(A), as.data.frame(B), as.data.frame(C))
    
    # Get order of dates for each row
    data %>%
            mutate(D = Date) %>%
            gather(key = Var, value = D, -Date) %>%
            arrange(Date, D) %>%
            group_by(Date) %>%
            summarize(Ord = paste(Var, collapse=">"))
    

    与原始问题有些相干,但希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2022-01-03
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多