使用r

时间:2015-09-18 08:03:36

标签: r if-statement functional-programming

我正在尝试计算一个需要三条信息的等式。

假设我有5个科目,每个科目回答3个问题,包括4个选项。

来自5个受试者的回答的数据集是a。

a<-as.data.frame(matrix(sample(c(1:4),15,replace=T),nrow=5))
colnames(a)<-c("a1","a2","a3")
> a
  a1 a2 a3
1  2  1  2
2  1  4  4
3  1  1  1
4  3  4  1
5  2  2  3

每个问题的每个选项都有自己的价值。例如,第一个问题的第二个选项的值为.7319431。数据集是b。

b<-as.data.frame(matrix(runif(12,0,1),nrow=3))
colnames(b)<-c("b1","b2","b3","b4")
> b
          b1        b2        b3        b4
1 0.83721477 0.7319431 0.5227578 0.9924321
2 0.02150756 0.7681706 0.8250167 0.1252194
3 0.27294672 0.8310693 0.9333875 0.8516141

此外,每个主题都有自己的价值。数据集是c。

c<-runif(5,0,1)
> c
[1] 0.9119466 0.9053619 0.5087231 0.2063420 0.1401520

在第一步,对于每个主题和每个问题,我需要将每个选项的每个值乘以每个主题的每个值,然后将它们相加以得到每个问题和每个主题的数字。我用下面的函数完成了这一步。

fun<-function(b,c){
  bc1<-t(sapply(c, FUN=function(x) b[,1]*x))
  bc2<-t(sapply(c, FUN=function(x) b[,2]*x))
  bc3<-t(sapply(c, FUN=function(x) b[,3]*x))
  bc4<-t(sapply(c, FUN=function(x) b[,4]*x))
  sum<-bc1+bc2+bc3+bc4
}

但是作为下一步,我应该考虑第一个数据集a,这样乘法只发生在数据集中的响应情况,a。换句话说,在上面的例子中,对于第一个主题和第一个问题,我只需要将第一个问题(.7319431)的第二个选项的值乘以第一个主题(.9119466)的值。对于同一主题的第二个问题,我需要计算.02150756(第二个问题的第一个选项的值)* .9119466(第一个主题的值)。

我目前陷入了这一步。我尝试在这里应用if-else函数,但没有成功。如果有人能帮我这一步,我真的很感激。

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是融合所有数据帧,长格式&#34;然后加入他们:

#subject answers data
a<-as.data.frame(matrix(sample(c(1:4),15,replace=T),nrow=5))
colnames(a)<-paste0("question",1:3)
a$subject<-paste0("subject",1:5)
#melting the data
a=melt(a,measure.vars = c('question1',"question2","question3"),value.name = "chosen_answer",variable.name = "question")

#questions score data
b<-as.data.frame(matrix(runif(12,0,1),nrow=3))
colnames(b)<-1:4
b$question<-paste0("question",1:3)
    b=melt(b,measure.vars=c("1","2","3","4"),value.name="question_score",variable.name="chosen_answer")

#joining questions score with subject answers
a=merge(a,b)

#subject score data
c<-data.frame(subject_score=runif(5,0,1),subject=paste0("subject",1:5))

a=merge(a,c)
a

    subject  question chosen_answer question_score subject_score
1  subject1 question1             4      0.8847954     0.5039638
2  subject1 question2             4      0.6780376     0.5039638
3  subject1 question3             4      0.3810658     0.5039638
4  subject2 question1             2      0.8054086     0.2152930
5  subject2 question2             4      0.6780376     0.2152930
6  subject2 question3             1      0.8296518     0.2152930
7  subject3 question1             4      0.8847954     0.5769765
8  subject3 question3             2      0.7000839     0.5769765
9  subject3 question2             3      0.5875164     0.5769765
10 subject4 question3             2      0.7000839     0.5738833
11 subject4 question1             2      0.8054086     0.5738833
12 subject4 question2             1      0.6064660     0.5738833
13 subject5 question2             3      0.5875164     0.1566587
14 subject5 question1             4      0.8847954     0.1566587
15 subject5 question3             4      0.3810658     0.1566587

之后,您可以使用该数据执行任何操作。

目前还不清楚你想要做什么。无论主题选择了什么选项,您的功能似乎都会按主题分数乘以问题分数。如果您提供预期输出的示例

,将会有所帮助