【问题标题】:How can I write a function to take the mean in a survey?如何编写函数以在调查中取平均值?
【发布时间】:2021-02-04 10:14:19
【问题描述】:

您好,我正在尝试编写一个代码/函数,它可以为我提供每个数据集的一组分数的平均值/平均值,但我需要一些帮助。

下面是一个例子。我需要这个函数来给我分数的总和。参与者可以在 0-101 的范围内进行选择。但是对于数字 2、5 和 6。我需要取相反的分数。最后我需要取平均值。所以分数除以6。 预期结果(答案)得分 = 226,平均值为 37.667

data Question Scores
1 ''I feel tense'' 76
2 ''I am calm'' 90
3 ''I am excited'' 52
4 ''I am worried'' 65
5 ''I am satisfied'' 90
6 ''I am relaxed'' 90

问题是我需要编写通用代码,以便我可以将它用于我拥有的每个数据集。因为每个参与者的问题都是随机给出的。例如(第一“我感到紧张”)可以在第 5 位等等。因此,我认为我需要一个 if else 语句,但我是 R 的初学者。也许(如果''我很平静'',是否还要这样做?)

我编写了一个有效的代码!但这不是很普遍,因为我必须更改每个数据集以匹配问题。非常感谢您提供一些见解或帮助编写此函数。


我的代码适用于一个数据集,它有点长而且看起来很糟糕。它也是基于我在 Excell 中处理的实际数据,这就是为什么它的命名不同。(数据 c 和数据 w 只是让我可以访问我想要的特定位置)

Data_c = DATA1$choice #Change here! 
Data_w = DATA2$word

我必须根据是否需要反转分数来更改每个问题。我注释掉了我不使用的内容。

Q1 = abs(Data_c[1]-101)
#Q1 = (Data_c[1])

#Q2 = abs(Data_c[2]-101)
Q2 = (Data_c[2])

Q3 = abs(Data_c[3]-101)
#Q3 = (Data_c[3])

Q4 = abs(Data_c[4]-101)
#Q4 = (Data_c[4])

#Q5 = abs(Data_c[5]-101)
Q5 = (Data_c[5])

#Q6 = abs(Data_c[6]-101)
Q6 = (Data_c[6])

df1 <- data.frame(Questions = Data_w,scores = c(Q1, Q2, Q3, Q4, Q5, Q6))

sum = df1$scores[1]+df1$scores[2]+df1$scores[3]+
df1$scores[4]+df1$scores[5]+df1$scores[6]

A = mean(sum/6)

提前感谢您阅读本文并提供见解

【问题讨论】:

  • 我不明白这些分数应该如何加起来为 62。与此相关的是,您所说的“反向分数”也不清楚:101 - 分数?
  • 您的代码将函数sum 替换为一个变量。 从不使用与函数相对应的变量名。

标签: r function for-loop if-statement


【解决方案1】:

我创建了两个函数,一个将问题编号用于反转,另一个将实际问题用于反转。使用这些函数,您可以自动化您的代码。

library(tidyverse)

df <- read.table(text = "data Question Scores
1 'I feel tense' 76
2 'I am calm' 90
3 'I am excited' 52
4 'I am worried' 65
5 'I am satisfied' 90
6 'I am relaxed' 90", header = TRUE)

mean_of_scores_num <- function(df, reverse_data){
  df %>% 
    filter(data %in% reverse_data) %>% 
    pull(Scores) %>% 
    append(101 -df %>% 
             filter(!data %in% reverse_data) %>% 
             pull(Scores)) %>% 
    mean()
}

mean_of_scores_ques <- function(df, reverse_question){
  df %>% 
    filter(Question %in% reverse_question) %>% 
    pull(Scores) %>% 
    append(101 -df %>% 
             filter(!Question %in% reverse_question) %>% 
             pull(Scores)) %>% 
    mean()
}

mean_of_scores_num(df, c(1,3,5))
#> [1] 46

mean_of_scores_ques(df, c('I am relaxed', 'I am worried'))
#> [1] 41.83333

reprex package (v0.3.0) 于 2021-02-04 创建

【讨论】:

    【解决方案2】:

    如果我理解正确,您需要一个键来定义语句分数是否反转。请注意,响应的顺序与密钥无关,但来自dat 的所有可能响应都必须在key 中表示。

    key <- read.table(text = " Question Reversed
    1 'I am calm' FALSE
    2 'I am excited' TRUE
    3 'I feel tense' TRUE
    4 'I am worried' TRUE
    5 'I am satisfied' FALSE
    6 'I am relaxed' FALSE", header = TRUE)
    

    然后,您需要选择关于键的正确响应顺序。这可以通过match 函数来完成。

    dat <- read.table(text = "data Question Scores
    1 'I feel tense' 76
    2 'I am calm' 90
    3 'I am excited' 52
    4 'I am worried' 65
    5 'I am satisfied' 90
    6 'I am relaxed' 90", header = TRUE)
    
    dat$Reversed = key$Reversed[match(dat$Question, key$Question)]
    

    由于TRUE/FALSE 变量本质上是1/0,我们可以使用它直接从两个替代函数的乘积中计算平均值。

    res <- sum(dat$Score * dat$Reversed, (101 - dat$Score) * !dat$Reversed) / nrow(dat)
    

    (101 - dat$Score) * !dat$Reversed) 中的感叹号很重要,因为它否定了TRUE/FALSE 指示符。

    【讨论】:

    • 这太棒了!但是我很难改变我的代码。在 R 中,我使用的是 CSV 文件而不是表格。你能解释一下如何改变它以便它可以运行吗?我尝试阅读读取表功能,但我仍然迷茫。 - 谢谢你
    • key
    • @Rose 您读取表格的问题可能出在文件名和分隔符上。 csv 文件中的分隔符通常是“,”,但也可以是“;”在某些计算机上。文件名应该是一个字符向量。试试read.table(file = "filename.csv", header = TRUE, sep = ",")
    • 啊,是的!它以这种方式运行,但现在我怎样才能访问这样的问题?我只是把它们放在代码中吗?比如可能 key
    • 谢谢!我现在开始工作了。我不得不像你说的那样修改我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多