2017-02-04 2 views
1

ベクトルの値を2で割った値で置き換える関数を記述しようとします。同じ値を2で割った値のdfの負の値の置換

# replacement function for a vector 
rep <- function(x) 
    x.half <- {abs(replace(x, which(x<0),x/2))} 

しかし、私は負と正の数とベクトルをシミュレートする場合、私は間違った結果を得るので、私は、この機能が正常に動作しないことを知っている:また

a <- c(1,-1,2,-2,3,-3,4,-4,5,-5,11,-11,12,-12,13,-13,21,-21,25,-25) 
a.rep <- rep(a) 

# data frame to test 
test <- cbind(a,a.rep) 

を、私はこの機能を適用すると、ベクトルaは、私はこのような警告メッセージが表示されます:

警告メッセージ: では(X/2、X、(X < 0))を置き換える:商品の 数を置き換えることです交換長の倍数ではない

明らかに、私の機能には何か問題があります。

+1

私の機能の短いバージョン、それは良いです。しかし、私は負の値を半分にするだけで、すべての正の値を変更してはいけません。 – marianess

+0

'a [which(a <1)] = a [which(a <1)]/2'これは機能しますが、このための関数を書く必要はありません。 –

+0

ちょうどそれが最高と最短の答えであることに気づいた:D Thank you @ChirayuChamoli – marianess

答えて

5

replaceニーズの3番目の引数が第二にサブセット化されている値と同じ長さに。

## determine which values are below zero 
a0 <- a < 0 
## replace them with their halved values 
replace(a, a0, a[a0]/2) 
[1] 1.0 -0.5 2.0 -1.0 3.0 -1.5 4.0 -2.0 5.0 -2.5 11.0 
[12] -5.5 12.0 -6.0 13.0 -6.5 21.0 -10.5 25.0 -12.5 
4

あなたはifelse()を使用することができます。

half_if_neg <- function(x) {ifelse(x < 0, x/2, x)} 
#sapply(a, half_if_neg) 
half_if_neg(a) 
+1

'ifelse'がベクター化されているので、' sapply() 'が必要です –

+0

非常に真実です、編集済み – Nate

2

は、我々はまた、割り当て

i1 <- a < 0 
a[i1] <- a[i1]/2 

や質問が既に回答されているが

pmax(a, (a*NA^(a >=0))/2, na.rm = TRUE) 
#[1] 1.0 -0.5 2.0 -1.0 3.0 -1.5 4.0 -2.0 5.0 -2.5 11.0 
#[12] -5.5 12.0 -6.0 13.0 -6.5 21.0 -10.5 25.0 -12.5 
+0

@RichScrivenこれは別の方法です。あなたの 'replace'メソッドは非常にオリジナルであると私は信じています。 – akrun

+0

@RichScriven私は答えでこれを使用する人は見つかりません。あなたがコメントについて話しているなら、私はコメントをチェックしなかったことを申し訳ありません。とにかく、私はまた、非常に独創的な代替方法を追加しました。 – akrun

+0

@RichScriven BTW、これは嘘つきの可能性はないと思いますよね? – akrun

5

を使用して、私は算術ソリューションを追加するために挑戦を感じたんすることができます。

表現

(sign(a) + 3)/4 * a 

# [1] 1.0 -0.5 2.0 -1.0 3.0 -1.5 4.0 -2.0 5.0 -2.5 11.0 -5.5 12.0 -6.0 13.0 -6.5 
#[17] 21.0 -10.5 25.0 -12.5 

を要求されるように返されます。それは

要件をどのように動作する

  • 負の数は、1/2を掛けれるべき
  • 正の数を変更してはならないことです。sign(a) == +1 [今すぐ1

aを掛けた場合sign(a) == -1その後、1/2

  • aを掛けた場合
  • これは

    • に変換することができ、我々は、線形関数を見つける必要がありy = f(x)= p * x + qであり、式uations

      • F(-1)= -p + Q = 1/2
      • F(1)= P + Q = 1

      PQを解くの後に我々はF(X)= 1/4 * X + 3/4を取得します。 X =符号(aと、を有するaの各要素を乗算するための係数である:

      1/4 *非常にある記号(a)+ 3/4

    関連する問題