1

すべてのループをはるかに高速な適用機能に置き換える作業を行っています。関数を前の列に依存させるのに問題があります。

現在、試験の点数に基づいて成績を割り当てる必要があります。

data <- matrix(runif(100),20,5)
colnames(data) <- letters[1:5]
sapply(colnames(data),function(x){
  ifelse((data[,x] <= 0 & data[,x] < 0.50),'C',
         ifelse((data[,x] >= 0.50 & data[,x] < 0.70) ,'B','A'))})

ただし、「C」が返される列に関係なく、その列の右側にあるすべての後続の成績がその行の「C」に置き換えられるように、適用機能を引き続き使用してコードを拡張することは可能ですか。

どうもありがとう

R.

4

3 に答える 3

2

ifelseまず、ループも現在のコードも必要ありません。ちょうど使用cut

as.character(cut(data,c(0,0.5,0.7,1),labels=c("C","B","A"),right=FALSE))->cdata
dim(data)->dim(cdata);cdata->data

2番目の問題(最初の「C」の後のすべてのセルを「C」で埋める)にはループが必要で、次のように実行できます。

t(apply(data,1,function(x)
 ifelse(seq(along=x)<min(c(which(x=="C"),Inf)),x,"C"))
)
于 2012-06-30T16:54:19.283 に答える
1

ifelseネストされたステートメントを使用する代わりに、 を使用してみてくださいcut。これにより、内容が少し読みやすくなります。例えば:

# Create data
data <- matrix(runif(100),20,5) 
# Assign a grade
x=apply(data, MARGIN=2, cut, breaks=c(0,0.5,0.7,1),labels=c('C','B','A'))

ここで、繰り返し C 関数を作成しますが、これは少しトリッキーです。

# Make the repeating C function.
find.c=function(x) 
    if ('C' %in% x) 
        c(
          x[seq(0,match('C',x)-1)], # Everything before the first C
          rep('C',length(x) - match('C',x) + 1) # After the first C
        )  
    else x
# Run it.
t(apply(x,MARGIN=1,find.c))
于 2012-06-30T16:38:51.590 に答える
0
data <- matrix(runif(100),20,5)
colnames(data) <- letters[1:5]
data.let <- sapply(colnames(data),function(x){
  ifelse((data[,x] <= 0 | data[,x] < 0.50),'C',
         ifelse((data[,x] >= 0.50 & data[,x] < 0.70) ,'B','A'))})
# Note the change of & to | above to make your sample data work

apply( data.let, 1, replaceCs )

`replaceCs は、ベクトルを取り、C に続くものをすべて C に置き換える関数です。

そのような例:

replaceCs <- function(x) {
   for(i in seq(2,length(x))) {
      if(x[i-1]=="C") x[i] <- "C"
   }
   x
}

おそらく、より巧妙なものを で作成できますrollapply

于 2012-06-30T16:31:03.913 に答える