【问题标题】:How to create a new column in a data frame depending on multiple criteria from multiple columns from the same data frame如何根据来自同一数据框的多个列的多个条件在数据框中创建新列
【发布时间】:2019-03-28 15:33:38
【问题描述】:

我有一个带有四个变量的数据框df1。一个是指太阳光,第二个是指月相光(由于月相而产生的光),第三个是指月位光(来自月亮的光,取决于它是否在天空中)和第四个是指天空的清晰度(与多云相反)。

我分别称它们为SLMPhLMPLSC。我想创建一个名为“全局光”的新列,白天仅取决于 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

【问题讨论】:

  • 感谢您提供示例数据和您想要的输出。到目前为止,您尝试了哪些方法,是否遇到任何错误(例如,花费时间过长、结果不理想等)?
  • 我不知道如何处理这个问题。我从这个脚本开始:df[,5] 0, x, "NA"))。我的想法是在 SL=0 之后应用另一个脚本。但后来我认为最好在这里问如何用一个脚本立即完成。
  • 别担心,这是一个问的好地方。对于未来,将您尝试的解决方案与您的问题放在一起是一个很好的做法。这样一来,人们就会看到您尝试过并且可以解决您的答案无效的具体原因。

标签: r


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 2019-03-19
    • 2020-07-09
    • 2017-01-17
    • 2020-11-21
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多