2017-04-14 142 views
1

我的任务是计算调查中四个变量的标准偏差和方差。其中两个变量是数字,但另外两个不是。我跑以下代码:r如何计算非数字数据的标准差和方差?

sapply(vclms[1:4], var) 

Vclms是变量被包含在和列1到4包括所有上述变量(包括数字和其他)数据帧。我希望能够为客户提供一个错误的非数值变量的方差,而是得到了以下内容:

> sapply(vclms[1:4], var) 
    grosswk  spend  hhldsize   sex 
8.383855e+04 4.744934e+04 1.288881e+00 2.434469e-01 
Warning messages: 
1: In FUN(X[[i]], ...) : 
    Calling var(x) on a factor x is deprecated and will become an error. 
    Use something like 'all(duplicated(x)[-1L])' to test for a constant vector. 
2: In FUN(X[[i]], ...) : 
    Calling var(x) on a factor x is deprecated and will become an error. 
    Use something like 'all(duplicated(x)[-1L])' to test for a constant vector. 

我不知道您是否可以考虑答案的两个非数值变量(hhldsize和性别)是否正确,但我想知道它如何能够得出答案?

+3

弃用警告是明确的:您的数据有'factor's,内部存储为'integer's。如果您的数据在这些列中是实际的“字符”,那么您应该看到“var(x $ x)中的警告:由强制引入的NAs和”NA“的差异。 – r2evans

+0

你是正确的,对“因素”整数的数值分析很可能没有意义。 (他们*可能*是有意义的IFF基础数据是序数并且正确排序。) – r2evans

回答

2

由于警告信息表明这是一件应该避免的,但如果你有一个因素

x<-factor(c("a","b","c","c","d","b","a","b","a","a")) 

在因素的每个值由整数表示。

as.numeric(x) 
# [1] 1 2 3 3 4 2 1 2 1 1 

这些数字由一个因子的levels()决定。每个级别为1

levels(x) 
# [1] "a" "b" "c" "d" 

所以a=1b=2,分配的一个整数起点等

当你做var(x),你真的做var(as.numeric(x))。请注意,这些数值可能对您的实际数据没有意义。

var(x) 
# [1] 1.111111 (plus warning) 
var(as.numeric(x)) 
# [1] 1.111111 
var(c(1, 2, 3, 3, 4, 2, 1, 2, 1, 1)) 
# [1] 1.111111