【问题标题】:Scoring a column with conditions in R using sd使用 sd 在 R 中对具有条件的列进行评分
【发布时间】:2017-10-19 19:43:31
【问题描述】:

我是一名 R/编码新手。我想根据某些条件为列分配分数。我在下面有一些随机数据,这有助于解释我自己的数据。

name    average score
a     -3.56714858     0
a     -0.41934072     0
a     -1.02200958     0
b      0.67713883     0
b      0.29228235     0
b      0.11338159     0
c     -1.48595572     0
c     -0.35328884     0
c     -1.26491347     0
d     -0.27093065     0
d     -0.14913264     0

我想做什么;

  • 如果(name=a & average > 2sd of benchmark)然后分配 score=2
  • if (name=a & average

编辑:基准 = 平均值(前 3 个“a”),所以我根据它们与前三个的比较来为其余的“a”打分,所以它们与前 3 个有多少标准偏差.

每个字母都有自己的基准或数字,我将其与之进行比较。所以我是一个个字母一个字母地手动检查,比如:

df$score[df$name == "a"
                & df$average >= benchmark
                & df$average <  (benchmark + sd(benchmark)]<- 1
df$score[df$name == "a"
                & df$average >= (benchmark + sd(benchmark)
                & df$average < (benchmark+ 2sd(benchmark))]<- 2.0
df$score[df$name == "a"
                & df$average > (benchmark+ 2sd(benchmark))]<- 2.5
df$score[df$name == "a"
                & df$average < benchmark
                & df$average >= (benchmark - sd(benchmark)]<- 1
df$score[df$name == "a" 
                & df$average < (benchmark - sd(benchmark)
                & df$average >= (benchmark - 2sd(benchmark))]<- 0.5
df$score[df$name == "a" 
                & df$average < (benchmark - 2sd(benchmark))]<- 0

我有数千行和比字母 a-d 更多的组。我希望我能找到一种更快的方法来做到这一点。我的长方法也会产生错误。请帮忙

我对每个组都有相同的评分原则,但是每个组的基准不同。

【问题讨论】:

  • 每组是否总是有一个阈值?结果是否总是有两个可能的值(大于阈值或小于阈值)?这些阈值以及高于/低于值的阈值是否因组(字母)而异?
  • 每组我有 6 个分数。大于平均值和小于平均值的 1sd,大于平均值的 1sd 和小于平均值的 2sd,以及大于平均值的 2sd,反之亦然。每个字母都有自己的评分标准,因此即使评分理念相同,它们都被与不同的东西进行比较
  • 您能否以您拥有的形式(例如数据框)分享上述 a、b、c、d 的示例阈值? (否则,要回答我们必须创建自己的版本)
  • mycondition 值或值列表还是什么?
  • 刚刚进行了编辑。我希望我现在说清楚了。谢谢

标签: r statistics aggregate grouping


【解决方案1】:

我会这样组织你的问题:首先你有你的数据框,然后你还应该有另一个数据框,我们称之为bench,变量为“name”、“benchmark”和“sd.基准”。类似的东西。那我就

你可以使用dplyr包:

require(dplyr)

df.new <- left_join(df, bench, by = "name") %>%
          mutate(score = ifelse(average >= (benchmark - sd.benchmark) & average < (benchmark + sd.benchmark), 1, 
                         ifelse(average >= (benchmark + sd.benchmark) & average < (benchmark + 2*sd.benchmark), 2,
                         ifelse(average >= 2*sd.benchmark, 2.5, 
                         ifelse(average < (benchmark - sd.benchmark) & average >= (benchmark - 2* sd.benchmark), .5, 0)))))

我的条件较少的原因是因为在您的示例中 benchmark - sd(benchmark)benchmark + sd(benchmark) 对于联合范围具有相同的值 1。

left_join 使用df 的所有值将bench 组合到df。就像merge(x,y, all.x = T)。从连接开始,这些步骤现在将数据传递给mutatemutate 基于 ifelse 语句创建一个新变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多