我正在尝试创建一个新变量(例如col3),从而根据不同变量(例如col2)的级别对最终变量的值进行不同的计算。
我尝试了几种不同的方法,例如简单地创建新变量以及使用dplyr进行突变。我当前的数据看起来像
> df
Grade Theta
1 -2.39
2 0.11
3 0.30
4 0.23
和新变量的对话机制就是
df$sstest1[df$Grade=='1']=(((df$Theta--.0961)/.657)*15)+100
df$sstest2[df$Grade=='2']=(((df$Theta--.0406)/.631)*15)+100
df$sstest3[df$Grade=='3']=(((df$Theta-.163)/.621)*15)+100
df$sstest4[df$Grade=="4"]=(((df$Theta-.318)/.702)*15)+100
通过这种方式,期望新的df应该是
> df
Grade Theta sstest1 sstest2 sstest3 sstest4
1 -2.39 47.627
2 0.11 103.58
3 0.30 103.31
4 0.23 98.12
但是我得到的结果是
> df
Grade Theta sstest1 sstest2 sstest3 sstest4
1 -2.39 47.627
2 0.11 44.15
3 0.30 38.33
4 0.23 42.14
sstest1值正确,但是我收到警告
Warning df$sstest1[df$Grade=='1']=(((df$Theta--.0961)/.657)*15)+100 number of items to replace is not a multiple of replacement length
Warning df$sstest2[df$Grade=='2']=(((df$Theta--.0406)/.631)*15)+100 number of items to replace is not a multiple of replacement length
Warning df$sstest3[df$Grade=='3']=(((df$Theta-.163)/.621)*15)+100 number of items to replace is not a multiple of replacement length
Warning df$sstest4[df$Grade=="4"]=(((df$Theta-.318)/.702)*15)+100 number of items to replace is not a multiple of replacement length
在进入完整的ifelse或mutate语句之前,我试图调和sstest2-sstest4如何产生不正确的值,而sstest1产生正确的值。
答案 0 :(得分:2)
好吧,您可以在右侧为所有行计算每个Theta的值。无论等级如何,每行都要考虑第一个值。执行(((df$Theta--.0406)/.631)*15)+100
,您将获得每一行的值。这个由4个元素组成的向量仅分配给sstest2
中的一行。因此,将使用第一个向量元素代替第二个向量元素。
这是dplyr的方法:
library(dplyr)
df <- data.frame(Grade = 1:4,
Theta = c(-2.39, 0.11, 0.3, 0.23))
thetafun <- function(theta, grade) {
a <- c(-0.961, -0.0406, 0.161, 0.318)
b <- c(0.657, 0.631, 0.621, 0.702)
return(((theta - a[grade]) / b[grade]) * 15 + 100)
}
df %>%
mutate(sstest = thetafun(Theta, Grade)) %>%
spread(key = Grade, value = sstest, sep = "")
如您所见,最后的df
可以称为sstest
:
Theta Grade1 Grade2 Grade3 Grade4
1 -2.39 67.37 NA NA NA
2 0.11 NA 103.6 NA NA
3 0.23 NA NA NA 98.12
4 0.30 NA NA 103.4 NA
答案 1 :(得分:0)
r的基本方法是将等式的右侧限制为与左侧相同的记录:
df$sstest1[df$Grade=='1']=(((df$Theta[df$Grade=='1']--.0961)/.657)*15)+100
df$sstest2[df$Grade=='2']=(((df$Theta[df$Grade=='2']--.0406)/.631)*15)+100
df$sstest3[df$Grade=='3']=(((df$Theta[df$Grade=='3']-.163)/.621)*15)+100
df$sstest4[df$Grade=="4"]=(((df$Theta[df$Grade=='4']-.318)/.702)*15)+100