4

別のTRUE/FALSEステータスに基づいて新しい変数を計算しています。

value<-c(2, 4, 5, 8, 2, 3, 1)
tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
df<-data.frame(value, tf)

次のコードは私が必要とすることを行います(「tf」がTRUEの場合は「value」を半分にします)...

df$newVals[which(df$tf)]<-df$value[which(df$tf)]/2
df$newVals[which(!df$tf)]<-df$value[which(!df$tf)]

...しかし、それはあまりにも複雑に感じます。より簡単なアプローチはありますか?

ありがとう

4

4 に答える 4

8

これがない非常に単純な解決策ifelseです:

df$newVals <- with(df, value / (tf + 1))

使い方?

ブール値(のようなtf)が数学演算子で使用される場合、それらは数値にキャストされます(FALSEに変換され0TRUEに変換されます1)。したがって、コマンドはsとsのtf + 1数値ベクトルを作成します。の値は、この新しいベクトルの値で除算されます。1で除算しても、元の値は変更されません。12value

于 2012-11-08T15:12:11.893 に答える
6

あなたはこれを行うことができますifelse

value<-c(2, 4, 5, 8, 2, 3, 1)
tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
df<-data.frame(value, tf)

df$newVals <- with(df, ifelse(tf, value/2, value))
于 2012-11-08T14:59:17.463 に答える
4

を使用ifelsetransformて、あなたのためにそれを行います

 transform(df, newVals=ifelse(tf, value/2,value))
      value    tf newVals
    1     2  TRUE     1.0
    2     4 FALSE     4.0
    3     5 FALSE     5.0
    4     8 FALSE     8.0
    5     2  TRUE     1.0
    6     3 FALSE     3.0
    7     1  TRUE     0.5
于 2012-11-08T14:59:57.993 に答える
1

少し異なるタック。すべての値ではなく、変更する必要のある値を更新し、を使用してそれらから選択するだけifelse()です。例えば

value<-c(2, 4, 5, 8, 2, 3, 1)
tf<-c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)
df<-data.frame(value, tf)

df <- transform(df, newVals = value) ## task a copy of `value`
df[df$tf, "newVals"] <- df[df$tf, "value"] / 2 ## update only ones we want
df

与える

> df
  value    tf newVals
1     2  TRUE     1.0
2     4 FALSE     4.0
3     5 FALSE     5.0
4     8 FALSE     8.0
5     2  TRUE     1.0
6     3 FALSE     3.0
7     1  TRUE     0.5

すべてのインデックスが気に入らない場合は、これを少し分解することができますind。行のインデックスを含むを作成するだけtfですTRUE

df <- transform(df, newVals = value)
ind <- with(df, which(tf))
df[ind, "newVals"] <- df[ind, "value"] / 2
df

> df
  value    tf newVals
1     2  TRUE     1.0
2     4 FALSE     4.0
3     5 FALSE     5.0
4     8 FALSE     8.0
5     2  TRUE     1.0
6     3 FALSE     3.0
7     1  TRUE     0.5
于 2012-11-08T15:15:30.300 に答える