1

次のデータフレームがあります。

varnames<-c("ID", "a.1", "b.1", "c.1", "a.2", "b.2", "c.2")

a <-matrix (c(1,2,3,4, 5, 6, 7), 2,7)

colnames (a)<-varnames

df<-as.data.frame (a)


   ID  a.1  b.1  c.1  a.2  b.2  c.2
 1  1    3    5    7    2    4    6
 2  2    4    6    1    3    5    7

「a.1」、「b.1」、および「c.1」の四分位数を使用して、「a.2」、「b.2」、および「c.2」列を分類したいと思います。

cat.a.2<-cut(df$a.2, c(-Inf, quantile(df$a.1), Inf))#categorizing a.2 using quartiles of a.1

cat.a.2
[1] (-Inf,3] (-Inf,3]
Levels: (-Inf,3] (3,3.25] (3.25,3.5] (3.5,3.75] (3.75,4] (4, Inf]

cat.b.2<-cut(df$b.2, c(-Inf, quantile(df$b.1), Inf))# categorizing b.2 using quartiles of b.1

cat.b.2
[1] (-Inf,5] (-Inf,5]
Levels: (-Inf,5] (5,5.25] (5.25,5.5] (5.5,5.75] (5.75,6] (6, Inf]


cat.c.2<-cut(df$c.2, c(-Inf, quantile(df$c.1), Inf))# categorizing c.2 using quartiles of c.1

 cat.c.2
[1] (5.5,7] (5.5,7]
Levels: (-Inf,1] (1,2.5] (2.5,4] (4,5.5] (5.5,7] (7, Inf]

このタスクを自動的に行う方法はありますか?

私は単純にsapply()で実験しました:

quant.vars<-c("a.1","b.1", "c.1") # creating a vector of the names of variables which quartiles I am going to use
vars<-c("a.2","b.2", "c.2") # creating a vector of the names of variables which I am going to categorize
sapply (vars,FUN=function (x){cut (df [,x], quantile (df[,quant.vars], na.rm=T))})
         a.2        b.2          c.2       
[1,] "(1,3.25]" "(3.25,4.5]" "(5.75,7]"
[2,] "(1,3.25]" "(4.5,5.75]" "(5.75,7]"

もちろん、それは私が望んでいた結果ではありません。

さらに、カット () 範囲に「Inf」を追加すると、次のエラーが表示されます。

sapply (vars,FUN=関数 (x){cut (df [,x], c(分位数 (df[,quant.vars], Inf), na.rm=T))})

  Error in quantile.default(df[, quant.vars], Inf) : 'probs' outside [0,1]

要約すると、私の質問は R の作成方法です。

  1. 接尾辞 1 (a.1.、b.1、c.1) を持つ変数の分位数を計算します

  2. 共通のプレフィックス (a.1 と a.2、b.1 と b.2、c.1 と c.2) を持つ変数のペアを認識します。

  3. 各ペアで、接尾辞 2 を持つ変数を分類するために、接尾辞 1 を持つ変数から取得された分位数を使用します (a.2 は a.1 分位数で分類され、b.2 は b.1 分位数で分類され、c.2 は c.2 で分類されます)。 1 分位数)

どうもありがとうございました

4

1 に答える 1

3

このようなもの?

#find duplicated letters
temp <- do.call(rbind,strsplit(names(df)[-1],".",fixed=TRUE))
dup.temp <- temp[duplicated(temp[,1]),]

#loop for cut
res <- lapply(dup.temp[,1],function(i) {
  breaks <- c(-Inf,quantile(a[,paste(i,1,sep=".")]),Inf)
  cut(a[,paste(i,2,sep=".")],breaks)
})

#make list a data.frame
res <- do.call(cbind.data.frame,res)
names(res) <- paste("cut",dup.temp[,1],2,sep=".")

#    cut.a.2  cut.b.2 cut.c.2
# 1 (-Inf,3] (-Inf,5] (5.5,7]
# 2 (-Inf,3] (-Inf,5] (5.5,7]

res[,1]
# [1] (-Inf,3] (-Inf,3]
# Levels: (-Inf,3] (3,3.25] (3.25,3.5] (3.5,3.75] (3.75,4] (4, Inf]

速度が問題になる場合は、最適化の余地があります。

于 2013-04-23T10:58:10.687 に答える