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”功能等效的功能?