【问题标题】:Add column with counts of another [duplicate]添加具有另一个计数的列[重复]
【发布时间】:2018-12-18 04:51:53
【问题描述】:

我有一个数据框 df,如下所示,其中 gender 列是具有两个级别的 factor

gender    age
m         18
f         14
m         18
m         18
m         15
f         15

我想添加一个名为count 的新列,它仅反映gender 级别出现在数据框中的次数。因此,最终,数据框将如下所示:

gender    age    count
m         18     4
f         14     2
m         18     4
m         18     4
m         15     4
f         15     2

我知道我可以通过table(df$gender) 给出因子出现的次数,但我不知道如何将这些结果转换为df 中的新列。我想知道如何使用table 函数——或者有没有更好的方法来实现我的新专栏?

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以试试ave:

    # first, convert 'gender' to class character
    df$gender <- as.character(df$gender)
    
    df$count <- as.numeric(ave(df$gender, df$gender, FUN = length))
    df
    #   gender age count
    # 1      m  18     4
    # 2      f  14     2
    # 3      m  18     4
    # 4      m  18     4
    # 5      m  15     4
    # 6      f  15     2
    

    更新@flodel 的评论 - 谢谢!

    df &lt;- transform(df, count = ave(age, gender, FUN = length))

    【讨论】:

    • 我试过这个,它用 NA 填充计数列。运行命令后,我收到消息“有 50 个或更多警告(使用 warnings() 查看前 50 个)”。警告类似于:“在 [&lt;-.factor(*tmp*, i, value = 2L) 中:无效因子水平,生成 NA”。我仔细检查了该列,它实际上是一个因素。
    • 对不起,我应该更仔细地阅读你的问题。如果您将“性别”转换为角色,它会起作用。我编辑我的问题。干杯。
    • 你可以做dat &lt;- transform(dat, count = ave(age, gender, FUN = length))而不用修改性别类。
    • @flodel,非常感谢您的评论!我很少使用transform - 似乎是时候开始了!干杯。
    • 好吧,transform 只是为了让事情变得漂亮。您在gender 是一个因素时遇到的问题是通过不使用gender 而是使用age 作为ave 的第一个参数来处理的。
    【解决方案2】:

    由于gender 是一个因素,您可以使用它来索引table 输出:

    dat$count <- table(dat$gender)[dat$gender]
    

    或者为了避免重复dat$太多次:

    dat <- transform(dat, count = table(gender)[gender])
    

    【讨论】:

      【解决方案3】:

      使用plyr

      library(plyr) 
      ddply(dat,.(gender),transform,count=length(age))
        gender age count
      1      f  14     2
      2      f  15     2
      3      m  18     4
      4      m  18     4
      5      m  18     4
      6      m  15     4
      

      【讨论】:

        【解决方案4】:

        还有一个data.table 版本,可以很好地衡量。

        library(data.table)
        df <- as.data.table(df)
        

        一旦你有了data.table,那么它就是一个简单的操作:

        df[,count := .N,by="gender"]
        df
        
        #   gender age count
        #1:      m  18     4
        #2:      f  14     2
        #3:      m  18     4
        #4:      m  18     4
        #5:      m  15     4
        #6:      f  15     2
        

        【讨论】:

          【解决方案5】:

          您可以设置计数,然后执行类似的操作,但这并不完全优雅。

          m.cnt <- length(which(df$gender == "m"))
          f.cnt <- length(which(df$gender == "f"))
          
          df$count <- NA
          df$count[which(df$gender == "m")] <- m.cnt
          df$count[which(df$gender == "f")] <- f.cnt
          

          您也可以使用 plyr,但这会导致一遍又一遍地重新计算相同的东西,这可能不值得,因为您只有 2 个因素。

          【讨论】:

          • 这是一个很好的解决方案,但对我来说并不实用。我以性别为例,但我要计算的因素实际上有 > 1000 个级别。
          猜你喜欢
          • 1970-01-01
          • 2012-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-26
          • 2019-05-07
          • 2021-10-08
          • 1970-01-01
          相关资源
          最近更新 更多