我有一个带有四个变量的数据框df1
。一种是指太阳光,第二种是指月相光(由于月相而产生的光),第三种是指月球位置光(来自月球的光,取决于是否在天空中)和第四个是指天空的清晰度(与阴天相对)。
我分别称它们为SL
,MPhL
,MPL
和SC
。我想创建一个称为“全局光”的新列,该列在白天仅取决于SL
,而在夜间取决于其他三个列(“ MPhL”,“ MPL”和“ SC”)。我想要的是在夜间(SL == 0
时),特定区域的光等于“ MPhL”,“ MPL”和“ SC”列的乘积。如果其中任何一个为0,那么夜晚的灯光也将为0。
由于我使用的是数十万行的矩阵,因此最好的方法是什么?作为我所拥有的一个例子:
SL<- c(0.82,0.00,0.24,0.00,0.98,0.24,0.00,0.00)
MPhL<- c(0.95,0.85,0.65,0.35,0.15,0.00,0.87,0.74)
MPL<- c(0.00,0.50,0.10,0.89,0.33,0.58,0.00,0.46)
SC<- c(0.00,0.50,0.10,0.89,0.33,0.58,0.00,0.46)
df<-data.frame(SL,MPhL,MPL,SC)
df
SL MPhL MPL SC
1 0.82 0.95 0.00 0.00
2 0.00 0.85 0.50 0.50
3 0.24 0.65 0.10 0.10
4 0.00 0.35 0.89 0.89
5 0.98 0.15 0.33 0.33
6 0.24 0.00 0.58 0.58
7 0.00 0.87 0.00 0.00
8 0.00 0.74 0.46 0.46
我想得到的是这样的:
df
SL MPhL MPL SC GL
1 0.82 0.95 0.00 0.00 0.82 # When "SL">0, GL= SL
2 0.00 0.85 0.50 0.50 0.21 # When "SL" is 0, GL = MPhL*MPL*SC
3 0.24 0.65 0.10 0.10 0.24
4 0.00 0.35 0.89 0.89 0.28
5 0.98 0.15 0.33 0.33 0.98
6 0.24 0.00 0.58 0.58 0.24
7 0.00 0.87 0.00 0.00 0.00
8 0.00 0.74 0.46 0.46 0.16
答案 0 :(得分:1)
最简单的方法是使用ifelse
函数:
GL <- ifelse(SL == 0, MPhL * MPL * SC, SL)
如果您想在更结构化的环境中工作,我可以推荐dplyr软件包:
library(dplyr)
tibble(SL = SL, MPhL = MPhL, MPL = MPL, SC = SC) %>%
mutate(GL = if_else(SL == 0, MPhL * MPL * SC, SL))
# A tibble: 8 x 5
SL MPhL MPL SC GL
<dbl> <dbl> <dbl> <dbl> <dbl>
1 0.82 0.95 0.00 0.00 0.820000
2 0.00 0.85 0.50 0.50 0.212500
3 0.24 0.65 0.10 0.10 0.240000
4 0.00 0.35 0.89 0.89 0.277235
5 0.98 0.15 0.33 0.33 0.980000
6 0.24 0.00 0.58 0.58 0.240000
7 0.00 0.87 0.00 0.00 0.000000
8 0.00 0.74 0.46 0.46 0.156584