R中是不是有等效于“count if”函数的功能?

Posted

技术标签:

【中文标题】R中是不是有等效于“count if”函数的功能?【英文标题】: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 中每个变量的“是”/“总”分数的列表。然后我想使用频率和变量名称来创建它们频率的条形图(与这个问题没有直接关系,而只是关于我为什么要完成这项任务的一些上下文。

感谢您的帮助!

【问题讨论】:

【参考方案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

【讨论】:

以上是关于R中是不是有等效于“count if”函数的功能?的主要内容,如果未能解决你的问题,请参考以下文章

Dojo 是不是有等效于 jQuery.trigger() 的功能?

与 Excel 中的 sumif 函数等效的简洁 R 代码 - 特别适用于数据框行

“statsmodels”或其他 Python 包是不是提供与 R 的“step”功能等效的功能?

python上是不是有等效的kable(R)?

Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?

等效于 hive 中 Presto 的 transform() 函数