Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据另一个变量的级别计算新变量_R - Fatal编程技术网

R 根据另一个变量的级别计算新变量

R 根据另一个变量的级别计算新变量,r,R,我正在尝试创建一个新变量(例如,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$

我正在尝试创建一个新变量(例如,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生成正确的值。

好的,在右侧,您计算所有行的每个θ的值。无论等级如何,每行都会考虑第一个值。执行
((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$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 = "")

基本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

基本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