使用R

时间:2017-09-19 14:03:31

标签: r dataframe mean

我是R的初学者 我正在尝试使用以下代码计算组间差异。

calcBetweenGroupsVariance <- function(variable,groupvariable)
{
 # find out how many values the group variable can take
 groupvariable2 <- as.factor(groupvariable[[1]])
 levels <- levels(groupvariable2)
 numlevels <- length(levels)
 # calculate the overall grand mean:
 grandmean <- mean(variable)
 # get the mean and standard deviation for each group:
 numtotal <- 0
 denomtotal <- 0
 for (i in 1:numlevels)
 {
    leveli <- levels[i]
    levelidata <- variable[groupvariable==leveli,]
    levelilength <- length(levelidata)
    # get the mean and standard deviation for group i:
    meani <- mean(levelidata)
    sdi <- sd(levelidata)
    numi <- levelilength * ((meani - grandmean)^2)
    denomi <- levelilength
    numtotal <- numtotal + numi
    denomtotal <- denomtotal + denomi
 }
 # calculate the between-groups variance
 Vb <- numtotal / (numlevels - 1)
 Vb <- Vb[[1]]
 return(Vb)
}

但是,使用此功能时出现以下错误,

calcBetweenGroupsVariance (data[3],data[2])
  

警告消息:在mean.default(变量)中:参数不是数字   或逻辑:返回NA

我理解使用均值函数时会出现问题。

以下是str(data)

的输出
'data.frame':   45 obs. of  11 variables:
 $ V1 : int  2 3 3 2 3 2 2 2 3 2 ...
 $ V2 : num  1.3243 -2.4546 0.1352 0.0676 -1.1901 ...
 $ V3 : num  0.913 -2.644 0.663 1.217 -0.409 ...  
 $ V4 : num  -1.863 1.965 -0.698 -0.945 0.617 ...
 $ V5 : num  -0.574 1.031 -0.308 -0.574 0.354 ...
 $ V6 : num  -0.8963 2.5702 0.0736 -1.3671 0.9045 ...
 $ V7 : num  0.2276 0.0624 0.5945 0.6194 0.5473 ...
 $ V8 : num  1.304 -1.624 0.408 0.368 -0.559 ...
 $ V9 : num  -0.1827 -0.9748 -0.5158 -0.0191 -0.3053 ...  
 $ V10: num  -0.964 0.67 -0.12 0.789 0.711 ...  
 $ V11: num  -0.833 -0.833 -0.833 -0.0539 -0.0539 ...

请建议如何摆脱这个错误。

谢谢和问候

1 个答案:

答案 0 :(得分:0)

您的脚本中存在与数组维度相关的多重错误,以及向量和列表之间的差异

假设你的函数的variable, groupvariable参数应该是vectors / 1d-arrays。

  • groupvariable2 <- as.factor(groupvariable[[1]])应为groupvariable2 <- as.factor(groupvariable),因为groupvariable不是列表,您不仅对第一个元素感兴趣,而且对所有元素感兴趣。

  • levelidata <- variable[groupvariable==leveli,]应为levelidata <- variable[groupvariable==leveli],因为variable只有一个维度(不是矩阵)

  • 对您的函数的调用应为calcBetweenGroupsVariance(data[[3]], data[[2]])(使用双括号[[]]))或calcBetweenGroupsVariance(data[, 3],data[, 2]),否则您将向该函数传递列表而不是向量。