3

max of 0 or j最初に a where is any variable を見つけてjから、 dataframe の k (k=1,2,...k) 変数についてこれらを合計しますdata。ではstata、次のようにしました。

 gen sum=max(0,x)+max(0,y)+max(0,z)+...+max(0,k)

R私は次のアプローチを使用しました:

data$sum<-ifelse(data$x<0,0,data$x*1)+ifelse(data$y<0,0,data$y*1)+ifelse(data$z<0,0,data$z*1)+...+ifelse(data$k<0,0,data$k*1)

R同じことを行うための代替の効率的なアプローチがあるかどうか疑問に思っていました。

4

3 に答える 3

5

これを試して:

mycols   <- c("x", "y", "z", "k")
data$sum <- rowSums(data[mycols] * (data[mycols] > 0))

いくつかのサンプル データで確認します。

data <- data.frame(x = runif(10) - 0.5,
                   y = runif(10) - 0.5,
                   z = runif(10) - 0.5,
                   k = runif(10) - 0.5)

identical(rowSums(data[mycols] * (data[mycols] > 0)), # mine
          ifelse(data$x < 0, 0, data$x * 1) +         # yours
          ifelse(data$y < 0, 0, data$y * 1) +
          ifelse(data$z < 0, 0, data$z * 1) +
          ifelse(data$k < 0, 0, data$k * 1))
# [1] TRUE
于 2013-01-12T03:14:22.203 に答える
4

flodel の優れたソリューションの代替案です。最初のソリューションは Stata コードにかなり似ていることに注意してください。

with( data,   # terrible name for an R object, BTW
   pmax(x, 0) + pmax(y, 0) + pmax(z, 0) +pmax(k,0) )

rowSums( apply(data[-5], 2, pmax, 0) )

2 番目のものはおそらく遅いですが、この R ゴルフ コンテストに出場しています。また、行列数学ソリューション:

as.matrix( (data[,1:4] > 0 )* data[, 1:4]) %*% rep(1, 4  )
于 2013-01-12T04:07:52.257 に答える
2

問題ではありませんが、Stata ですべての変数を書き出すのは、面倒でエラーが発生しやすい可能性があります。ここでループが発生する可能性があります。

gen sum = 0 
quietly foreach v of var varlist { 
    replace sum = sum + `v' if inrange(`v', 0, .) 
} 

varlistがどうあるべきかを理解する必要があります。

于 2013-01-12T09:59:32.903 に答える