2013-07-30 24 views
1

我正在使用miscTools软件包并希望使用colMedians。我将数据分成许多组,结果这些组中的一些只有一行。因此,colMedians说“参数'x'必须是数字”。有没有办法让colMedians忽略这些组(或让这些值反刍),但是计算具有多行的组的Stage.Duration的中位数?在R中,colmedia如何忽略1行条目? (在分组/分组数据中)

数据看起来像这样:

Opportunity.Name  Stage.Duration  Probability 
     Bob     10     20 
     Bob     20     50 
     Bob     76     90 
     Jon     50     80 
     Jon     34     50 
     Jon     23     100 

gdata <- split(data, Opportunity.Name) 
gdata$`Bob` 
Opportunity.Name  Stage.Duration  Probability 
     Bob     10     20 
     Bob     20     50 
     Bob     76     90   
seven <- lapply(gdata, function(x){x[x$Probability>=70,]}) 
seven 
Opportunity.Name  Stage.Duration  Probability 
     Bob     76     90   

med<-sapply(seven, function(x) colMedians(x[,c("Stage.Duration", "Probability")])) 

注:“配有”码计算中位数为Stage.Duration和概率,但我只想Stage.Duration,我只需要两列运行此特定代码并不知道如何运行类似的功能。此代码适用于colMeans。

+0

则不要使用两列子集...用'colMedians(X [, '概率',降= FALSE])'...或者直接使用'median'函数... – Justin

+1

我只是使用'drop = FALSE' –

+0

我尝试了colMeans上面的代码,它改变了我的一些数据(我怀疑是因为drop = FALSE)。最终,我需要将其导入Excel中,以保持格式化的连续性,这将有所帮助。 – user2634937

回答

0

使用括号[ ]对数组或矩阵进行子集化时,如果结果合适,通常会将结果强制转换为较小的维度对象。要关闭该行为,有一个名为drop标志:

# Sample Matrix 
M <- matrix(1:20, ncol=5) 

# Gets coerced to a single vector: 
colMeans(M[3, ]) 
    # Error in colMeans(M[3, ]) : 
    # 'x' must be an array of at least two dimensions 

# Remains two-dimensional 
colMeans(M[3, , drop=FALSE]) 
    # [1] 3 7 11 15 19 
+0

drop = FALSE正在考虑我用lapply滤掉的值。有没有办法确保drop = FALSE确认这些过滤值? – user2634937

+0

我不确定你指的是什么。也许你可以发布一个可重现的例子? –

+0

我不太确定我怎么能够给你一个例子(对不起,我是新的:(),但最终,当我应用drop = FALSE时,它会计算原始数据集的中位数(在我过滤之前out out probability大于或等于70%),它不会计算修剪后的数据“seven”,但是gdata $'Bob' – user2634937