2012-07-11 59 views
2

这是一个相当基本的问题,但还没有看到各种论坛一个很好的答案。 说我一个简单的矢量输出位数的一个数据帧

x = runif(10,1,4) 
> x 
[1] 3.292108 1.388526 2.774949 3.005725 3.904919 1.322561 2.660862 1.400743 
[9] 2.252095 3.567267 
> 

接着我计算一些位数,

> z = quantile(x,c(0.1,0.8)) 
> z 
10%  80% 
1.381929 3.347140 
> 

予需要此输出作为数据帧。所以我尝试了以下内容

> y = data.frame(id = names(z),values=z) 
> y 
id values 
10% 10% 1.381929 
80% 80% 3.347140 

我看到“%”列被重复。此外,当我尝试

> y$id[1] 
[1] 10% 
Levels: 10% 80% 

,而我期待它是要么只是“10%”或0.1 赞赏任何帮助。

回答

4

名字只是概率所以

y <- data.frame(id = c(0.1, 0.8), values = z) 

会工作。

所以会在返回data.frame

quantile_df <- function(x, probs, na.rm =F, names = F, type = 7, ...){ 
    z <- quantile(x, probs, na.rm, names, type) 
    return(data.frame(id = probs, values = z)) 
} 

quantile_df(x, probs = c(0.1, 0.8)) 
## id values 
## 1 0.1 1.343383 
## 2 0.8 2.639341 
+0

喜欢这种方法来GSEE的,虽然双方的工作。当我处理这个下游时,让它有小数点实际上更容易。 – broccoli 2012-07-11 23:53:33

6

你得到的名称两次,因为你给data.frame的名字两次 - 第一次作为一个载体,然后为命名载体的一部分。你得到level是因为在默认情况下,stringsAsFactorsTRUE

set.seed(1) 
x <- runif(10,1,4) 
z <- quantile(x, c(0.1, 0.8)) 
y <- data.frame(id=names(z), values=unname(z), stringsAsFactors=FALSE) 
y 
# id values 
#1 10% 1.563077 
#2 80% 3.701060 

y$id[1] 
#[1] "10%" 
+0

+1'unname'一个函数进行包装。俏皮。 – Ryogi 2012-07-11 23:43:22