【问题标题】:Using frequency of column value in dataframe to calculate new column value使用数据框中列值的频率来计算新列值
【发布时间】:2013-03-21 18:34:17
【问题描述】:

所以我有一个示例数据框,其中包含 id、count 和 username 列,其中 id 和 count 是数字,username 是字符串。

对于数据框的每一行,我想设置一个名为“比率”的新列的值,比率定义为

计数/行数,其中用户名 == 该行中的用户名

提供的数据示例:
在用户名为“Tom”的每一行中,比率将为 count/4 ,因为用户 Tom 在数据中被找到了四次。

这只是我的问题的简化版本,for 循环不是一个选项,因为我的原始数据框有大约 340 万行,而我之前使用 for 循环来迭代例如的唯一值的方法'username' 来解决这个问题需要很长时间。

我的数据框的输入:

structure(list(id = 1:20, count = c(140L, 89L, 17L, 114L, 129L, 
86L, 21L, 50L, 197L, 160L, 8L, 14L, 78L, 208L, 155L, 55L, 63L, 
20L, 189L, 79L), usernames = structure(c(4L, 3L, 5L, 5L, 2L, 
3L, 1L, 1L, 3L, 1L, 3L, 2L, 5L, 5L, 4L, 4L, 2L, 2L, 2L, 3L), .Label = c("Jerry", 
"Mark", "Phil", "Tina", "Tom"), class = "factor")), .Names = c("id", 
"count", "usernames"), row.names = c(NA, 20L), class = "data.frame")

我希望我为您提供了一切来理解和重现问题,如果缺少某些内容,请不要犹豫,在 cmets 中提及。

【问题讨论】:

    标签: r vector dataframe


    【解决方案1】:

    有多种选择。这里有三个,一个在基础 R 中,一个使用 data.table,还有一个使用“plyr”。两者都假设我们从名为“mydf”的 data.frame 开始:

    基础 R

    within(mydf, {
      temp <- as.numeric(ave(as.character(usernames), usernames, FUN = length))
      ratio <- count/temp
      rm(temp)
    })
    

    数据表

    library(data.table)
    DT <- data.table(mydf)
    DT[, ratio := count/.N, by = "usernames"]
    DT
    

    plyr

    library(plyr)
    ddply(mydf, .(usernames), transform,
          ratio = count/length(usernames))
    

    【讨论】:

    • 非常好的解决方案。可悲的是,我刚刚意识到我的示例被过度简化到了无法描述实际问题的程度。我将投票删除我的问题并发布一个新问题。很抱歉在这个问题上浪费了您的时间
    • @Rickyfox,我会说协议是(1)接受答案并发布一个新问题,如果问题与所提出的问题有很大不同,或者(2)更新相关问题如果问题没有显着不同并且您认为其中一个答案可能可以修改以适应新要求,请详细说明。 Stack Overflow 不仅可以回答您的 特定问题,还可以为其他人提供从类似问题中获得答案的平台。删除前请记住这一点。
    【解决方案2】:

    您可以为此使用ave

    transform(d, x=count/as.numeric(ave(d$usernames, d$usernames, FUN=length)))
    

    【讨论】:

    • +1 给你。我刚刚意识到我们有几乎相同的基本 R 答案:)
    猜你喜欢
    • 2022-11-28
    • 2022-01-27
    • 2014-04-18
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多