If_else 语句基于多个列,创建一个基于 R 中的真实语句数量平均的分数

Posted

技术标签:

【中文标题】If_else 语句基于多个列,创建一个基于 R 中的真实语句数量平均的分数【英文标题】:If_else statements based on multiple columns that creates a score that is averaged based on how many true statements in R 【发布时间】:2022-01-20 15:14:43 【问题描述】:

我有多个列已分类

数据属于以下类别:

Q1 Q2 - TS
Q3 - NI
Q4 Q5 Q6 - SALES

我想为每个类别创建一个给出分数的列

例如:

每个类别的问题都有一个分数

4 = +1 
-4= +0
NA or 0 = blank/no value

因此,基本上,如果该类别包含 3 个问题,并且 1 个问题的 na 或 0,它不会为总分增加任何价值。

Q5 Q6 Q7      SALES_SCORE
na. 4. 0   =.   1/1= 1. 

(因为只有一题为总分增加了价值)

Q5 Q6 Q7      SALES_SCORE
0. -4. -4   =.   (0+0)/2= 0.

我一直试图在 R 中创建条件 if_else 语句,但我没有运气。 这是我尝试过的:

df$TS_Score <- (sum(if_else(df$Q5 > 0 | df$Q6 >0 | df$Q7 >0, 1,

                     if_else(df$Q5 < 0 | df$Q6 <0 | df$Q7 <0, 0,

                      if_else(df$Q5 == 0 | df$Q6 == 0 | df$Q7 == 0, "",

                       if_else(df$Q5 == NA | df$Q6 == NA | df$Q7==NA,"" 
                        )))))

【问题讨论】:

【参考方案1】:

几个辅助函数似乎很有用:

num <- function(x) ifelse(x > 0 & !is.na(x), 1, 0)
den <- function(x) ifelse(x != 0 & !is.na(x), 1, 0)
# test functions
num(c(4, -4, 0, NA)) # 1 0 0 0
den(c(4, -4, 0, NA)) # 1 1 0 0

然后计算每个期望的分数:

df$TS_Score <- (num(df$Q1) + num(df$Q2)) / 
  (den(df$Q1) + den(df$Q2))
df$NI_Score <- num(df$Q3) / den(df$Q3)
df$Sales_Score <- (num(df$Q4) + num(df$Q5) + num(df$Q6)) / 
  (den(df$Q4) + den(df$Q5) + den(df$Q6))

【讨论】:

以上是关于If_else 语句基于多个列,创建一个基于 R 中的真实语句数量平均的分数的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包为dataframe添加数据列实战( Add Columns):基于mutate()函数添加一个或者多个数据列(尾部添加头部添加条件生成某个具体数据列的前后)

基于多个日期列创建最小日期列的 SQL 代码 [重复]

R - 子集 - 基于列值的 grepl 选择排除行 [重复]

使用 dplyr contains() 基于多个字符串选择列

R基于具有添加条件的特定列合并两个数据集

R语言dplyr包if_else条件判断选择函数实战