我想先找max of 0 or j
j
,其中data
是任何变量,然后对数据框stata
的k(k = 1,2,... k)变量求和。在 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
我想知道在{{1}}中是否有另一种有效的方法可以做同样的事情。
答案 0 :(得分: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
答案 1 :(得分: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) )
第二个可能比较慢,但它正在参加这场R-golf比赛。也是矩阵数学解决方案:
as.matrix( (data[,1:4] > 0 )* data[, 1:4]) %*% rep(1, 4 )
答案 2 :(得分:2)
不是问题,但写出Stata中的每个变量可能会很乏味且容易出错。这里可能有一个循环的范围:
gen sum = 0
quietly foreach v of var varlist {
replace sum = sum + `v' if inrange(`v', 0, .)
}
你必须弄清楚varlist应该是什么。