【问题标题】:Is there an equivalent to a "count if" function in R?R中是否有等效于“count if”函数的功能?
【发布时间】:2020-12-30 20:23:53
【问题描述】:

这可能是一个非常简单的问题,但我正在尝试创建一个 for 循环函数,该函数将 1)从我的 df 中的每个变量的“yes”/“no”列中找到“yes”的百分比和2) 然后将该答案添加到列表中,以便稍后在图表中使用。

例如

j <- c("yes", "no", "no", "yes")
v <- c("no", "no", "no", "yes")
d <- c("yes", "no", "yes", "yes")

df <- data.frame(j,v,d)
df

frequency <- list()

for (i in df){
  if(i == "Checked") {
    freq <- #countif(df$i == "yes")/count(df, i)
frequency[[paste0("element", i)]] <- freq
  }
}

我相信我离 1) 我不知道如何仅计算列中的特定值和 2) 我无法将输出添加到列表中。

我的理想输出将是 df 中每个变量的“是”/“总”分数的列表。然后我想使用频率和变量名称来创建它们频率的条形图(与这个问题没有直接关系,而只是关于我为什么要完成这项任务的一些上下文。

感谢您的帮助!

【问题讨论】:

    标签: r for-loop count append


    【解决方案1】:

    base R 中,我们可以直接执行此操作而不是循环,即获取逻辑matrix (df == 'yes') 的列均值

    colMeans(df == 'yes')
    #   j    v    d 
    #0.50 0.25 0.75 
    

    如果我们需要list 作为输出,请使用 as.list 包装

    as.list(colMeans(df == 'yes'))
    #$j
    #[1] 0.5
    
    #$v
    #[1] 0.25
    
    #$d
    #[1] 0.75
    

    dplyr

    library(dplyr)
    df %>% 
         summarise(across(everything(), ~ mean(. == 'yes')))
    #    j    v    d
    #1 0.5 0.25 0.75
    

    或使用for 循环

    frequency <- vector('list', ncol(df))
    names(frequency) <- paste0("element", seq_along(frequency))
    for(i in seq_along(df)) frequency[[i]] <- mean(df[[i]] == "yes")
    frequency
    #$element1
    #[1] 0.5
    
    #$element2
    #[1] 0.25
    
    #$element3
    #[1] 0.75
    

    【讨论】:

      【解决方案2】:

      我想你正在寻找这个。如果您使用列索引移动,为了让您的循环更好地工作。然后,您可以使用length()which() 计算等于Yes 的元素,并使用nrow() 除以每列的总元素。代码如下:

      #Data
      j <- c("yes", "no", "no", "yes")
      v <- c("no", "no", "no", "yes")
      d <- c("yes", "no", "yes", "yes")
      df <- data.frame(j,v,d,stringsAsFactors = F)
      df
      #List
      frequency <- list()
      #Loop
      for (i in 1:ncol(df)){
          freq <- length(which(df[,i] == "yes"))/nrow(df[,i,drop=F])
          frequency[[paste0("element", i)]] <- freq
      }
      

      输出:

      frequency
      $element1
      [1] 0.5
      
      $element2
      [1] 0.25
      
      $element3
      [1] 0.75
      

      【讨论】:

        【解决方案3】:

        另一个基本 R 选项是使用prop.table,例如,

        Map(function(x) prop.table(table(x))["yes"],df)
        

        给了

        $j
        yes
        0.5
        
        $v
         yes
        0.25
        
        $d
         yes
        0.75
        

        【讨论】:

          猜你喜欢
          • 2020-09-07
          • 1970-01-01
          • 1970-01-01
          • 2019-09-17
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          • 2011-02-13
          • 1970-01-01
          相关资源
          最近更新 更多