代码之家  ›  专栏  ›  技术社区  ›  Dr. Fabian Habersack

如何计算数据集中指示因子水平相对频率的变量?

  •  0
  • Dr. Fabian Habersack  · 技术社区  · 5 年前

    让这是我的数据:

    my.data<-data.frame(name=c("a","b","b","c","c","c"))
    

    我需要的是一个变量,它指示每个名称及其在数据集中的相对频率。基本上,这看起来是这样的:

      name    target
    1    a 0.1666667
    2    b 0.3333333
    3    b 0.3333333
    4    c 0.5000000
    5    c 0.5000000
    6    c 0.5000000
    

    我尝试的是为每个名称计算虚拟变量,然后根据这些虚拟变量计算新变量,这些变量指示数据集中每个名称的相对频率。见下文:

    temp_dummies<-data.frame(spatstat::dummify(my.data$name))
    my.data<-cbind.data.frame(my.data, temp_dummies)
    rm(temp_dummies)
    
    my.data %>%
      dplyr::mutate(a_per=mean(a),
                    b_per=mean(b),
                    c_per=mean(c)) -> my.data
    

    现在,我需要提取每个名称的相对频率,并将其聚合回来,以得到我的目标变量。我想我应该在下面这样做,但我不知道该变异什么。

    my.data %>%
      dplyr::group_by(name) %>%
      dplyr::mutate(...) -> my.data
    

    问题:

    1. 如何使用dplyr获取目标变量?我走对了吗?
    2. 有没有更容易的方法来达到同样的结果?
    3. 是否可以编写一个自动完成所有这些工作的函数?这似乎是一个相当标准的问题,我们应该能够通过简单地应用 function(x) name .
    2 回复  |  直到 5 年前
        1
  •  1
  •   Ronak Shah    5 年前

    我们可以使用 add_count 计算每个 name 然后用 n() .

    library(dplyr)
    
    my.data %>%
       add_count(name) %>%
       mutate(n = n/n())
    
    #  name      n
    #  <fct> <dbl>
    #1 a     0.167
    #2 b     0.333
    #3 b     0.333
    #4 c     0.5  
    #5 c     0.5  
    #6 c     0.5  
    
        2
  •  1
  •   KoenV    5 年前

    base -R,您可以使用以下一个衬板:

    my.data$target <- (table(my.data$name)/nrow(my.data))[ my.data$name ]
    

    解释 在几行代码中:

    我们使用 table 函数以获取 名称 并用df中的行数除以 nrow . 然后在“表”中查找当前行的“名称”。该值保存在新列的相应行中。

    t <- table(my.data$name)/nrow(my.data)
    my.data$target <- t[ my.data$name ]
    my.data
    
      name    target
    1    a 0.1666667
    2    b 0.3333333
    3    b 0.3333333
    4    c 0.5000000
    5    c 0.5000000
    6    c 0.5000000