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()函数添加一个或者多个数据列(尾部添加头部添加条件生成某个具体数据列的前后)
R - 子集 - 基于列值的 grepl 选择排除行 [重复]