【问题标题】:Quick way to conditionally assign values based on a column with a lot of values? [duplicate]基于具有大量值的列有条件地分配值的快速方法? [复制]
【发布时间】:2017-04-24 20:45:39
【问题描述】:

假设我的数据如下所示:

df
ID  Location  
 1   54
 2   35 
 3   54
 4   35
 5   71

我有兴趣找出访问给定位置的频率,然后根据位置列中的值将该频率(即总和)分配给一个新列。

首先,我尝试使用table 函数:

count<-as.data.frame(table(df))
count
var1  freq
54    2
35    2
71    1

从这里开始,我想在 df 中创建一个名为 count 的新列,例如,它为对应于 Location=54 的每个 ID 分配 freq=2。即,df 现在看起来像这样:

df
ID  Location count 
 1   54      2
 2   35      2
 3   54      2
 4   35      2
 5   71      1

我的真实数据包含太多 Location 值,我无法编写 ifelse 语句来有条件地分配这些计数值。我不确定如何以有效的方式完成(我也可以创建一个空列并在 dplyr 中使用replace 函数,但这同样很费力。有什么提示吗?

谢谢!

【问题讨论】:

    标签: r dplyr conditional


    【解决方案1】:

    我们可以使用dplyr 中的add_count(在开发版本中 - 即将发布 0.6.0)

    library(dplyr)
    df %>% 
       add_count(Location)
    # A tibble: 5 × 3
    #     ID Location     n
    #   <int>    <int> <int>
    #1     1       54     2
    #2     2       35     2
    #3     3       54     2
    #4     4       35     2
    #5     5       71     1
    

    但如果我们想从table 输出中执行此操作,我们可以使用merge

    merge(df, as.data.frame(table(df$Location)), by.x= "Location", by.y = "Var1")
    

    【讨论】:

    • 奇怪的是我收到了这个错误信息:函数列表中的错误[[k]](值):找不到函数“add_count”
    • 我相信 add_count 是新添加到 dplyr 0.6 中的,还没有在主版本中。见github.com/tidyverse/dplyr/releases
    • @epi99 是的,你是对的,更新了帖子
    【解决方案2】:
    library(dplyr)
    df %>% 
      group_by(Location) %>%
      mutate(n = n())
    
    #      ID Location     n
    #   <int>    <int> <int>
    # 1     1       54     2
    # 2     2       35     2
    # 3     3       54     2
    # 4     4       35     2
    # 5     5       71     1
    

    【讨论】:

      【解决方案3】:

      您可以使用ave来统计每个Location对应的数据的length

      ave(1:NROW(df), df$Location, FUN = length)
      #[1] 2 2 2 2 1
      

      【讨论】:

        【解决方案4】:

        也可以在data.table 中执行此操作:

        library(data.table)
        dt[,count := .N, by = Location]
        
        dt
        #   ID Location count
        #1:  1       54     2
        #2:  2       35     2
        #3:  3       54     2
        #4:  4       35     2
        #5:  5       71     1
        

        数据:

        dt <- fread("ID  Location  
                      1   54
                      2   35 
                      3   54
                      4   35
                      5   71")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-29
          • 1970-01-01
          • 2017-07-06
          • 2016-02-16
          • 1970-01-01
          • 1970-01-01
          • 2011-05-18
          相关资源
          最近更新 更多