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 中的真实语句数量平均的分数的主要内容,如果未能解决你的问题,请参考以下文章