【问题标题】:Grouping variables based on location, year and person name根据位置、年份和人名对变量进行分组
【发布时间】:2016-08-28 20:02:15
【问题描述】:

我想创建一个列聚合

A<- c("xyz", "xyz", "xy", "xx","xx", "y")
year<- c(2009,2010,2009,2009,2010,2009)
location<- c('london', 'london', 'paris', 'newyork','mumbai','sydney')
df<- data.frame(A, year, location)

我想创建一个名为“yearsofexperience”的变量,它将总结一个人在给定位置度过的总年数。

   A     year         location  yearsofexperience
   xyz  2009          london     2
   xyz  2010          london     2
   xy   2009          paris      1
   xx   2009          newyork    1
   xx   2010          mumbai     1
   y    2009          sydeny     1

有人可以帮忙吗?

【问题讨论】:

  • df %&gt;% group_by(A, location) %&gt;% mutate(yearsofexperience = n())

标签: r dplyr plyr


【解决方案1】:

如果有人对此感兴趣,可以使用data.table 的(可以说是更简洁的)解决方案,它在大型数据集上应该更快。

require(data.table)
setDT(df)[, yearsofexperience := .N, by = .(A, location)]
df
     A year location yearsofexperience
1: xyz 2009   london                 2
2: xyz 2010   london                 2
3:  xy 2009    paris                 1
4:  xx 2009  newyork                 1
5:  xx 2010   mumbai                 1
6:   y 2009   sydney                 1

【讨论】:

    【解决方案2】:

    使用dplyr,您可以使用group_bymutate 来获得您在问题中列出的输出

    library(dplyr)
    df %>% 
      group_by(A, location) %>% 
      mutate(yearsofexperience = n()) %>% 
      ungroup()
    

    如果要折叠给定 Alocation 的条目,可以使用 summarise 代替 mutate 语句。这将删除 year 变量。

    df %>% 
      group_by(A, location) %>% 
      summarise(yearsofexperience = n()) %>% 
      ungroup()
    

    【讨论】:

    • 太棒了!非常感谢!
    【解决方案3】:

    您可以使用n_distinct() 计算每个人和位置组合的唯一年份。这应该适合你:

    library(dplyr)
    df %>% group_by(A, location) %>% mutate(yoe = n_distinct(year))
    
    # Source: local data frame [6 x 4]
    # Groups: A, location [5]
    
    #       A  year location   yoe
    #  <fctr> <dbl>   <fctr> <int>
    #1    xyz  2009   london     2
    #2    xyz  2010   london     2
    #3     xy  2009    paris     1
    #4     xx  2009  newyork     1
    #5     xx  2010   mumbai     1
    #6      y  2009   sydney     1
    

    也可以使用data.table语法,对应的函数是uniqueN()

    library(data.table)
    setDT(df)[, yoe := uniqueN(year), .(A, location)]
    

    【讨论】:

      【解决方案4】:

      我们可以从base R使用ave

      df$yearsofexperience <- with(df, ave(year, location, A, FUN = length))
      df
      #     A year location yearsofexperience
      #1 xyz 2009   london                 2
      #2 xyz 2010   london                 2
      #3  xy 2009    paris                 1
      #4  xx 2009  newyork                 1
      #5  xx 2010   mumbai                 1
      #6   y 2009   sydney                 1
      

      如果这是基于 lengthunique 元素

      df$yearsofexperience <- with(df, ave(year, location, A, FUN = function(x) length(unique(x))))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-06
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        • 2021-12-07
        相关资源
        最近更新 更多