R语言中逐行取最小值计算数据框新列z的实现问题
解决逐行计算x乘以y和1的较小值的问题
你遇到的问题很典型——min()函数是取整个向量的全局最小值,所以min(df$y, 1)会先把整个df$y列的最小值(也就是0.1)和1比较,最终得到0.1,导致所有行的x都乘了同一个数。
要实现逐行分别取y和1的较小值,你需要用R里的向量化函数pmin(),它会对两个向量的对应元素逐一比较,返回每个位置的最小值。
正确代码:
df <- data.frame(x = c(3, 5, 4, 4, 3, 2), y = c(.9, .8, 1, 1.2, .5, .1)) df$z <- df$x * pmin(df$y, 1)
运行结果:
执行后df会变成:
x y z 1 3 0.90 2.70 2 5 0.80 4.00 3 4 1.00 4.00 4 4 1.20 4.00 5 3 0.50 1.50 6 2 0.10 0.20
如果你想用另一种方式(比如条件判断),也可以用ifelse()实现,不过pmin()更简洁高效:
df$z <- df$x * ifelse(df$y < 1, df$y, 1)
内容的提问来源于stack exchange,提问作者pyll
相关产品推荐
相关产品推荐

