4

これはかなり基本的な質問ですが、さまざまなフォーラムで良い答えを見ていません。単純なベクトルがあるとしましょう

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

2 に答える 2

7

名前は単なる確率なので

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
于 2012-07-11T23:38:05.840 に答える
6

名前を2回指定しているため、名前は2回取得されます。data.frame最初はベクトルとして、次に名前付きベクトルの一部としてです。levelデフォルトでstringsAsFactorsはがであるため、sを取得していますTRUE

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%"
于 2012-07-11T23:35:52.230 に答える