【问题标题】:Change value of variables for certain months of an R data.frame?更改 R data.frame 某些月份的变量值?
【发布时间】:2020-12-04 02:36:48
【问题描述】:

Month =< 2 & Month >= 11 时,我想将ObsSim 的值更改为-1.23。看起来很简单,但我没有想出任何解决方案。

library(tidyverse)
library(lubridate)

set.seed(123)

DF <- data.frame(Date = seq(as.Date("2001-01-01"), to = as.Date("2003-12-31"), by = "day"),
                  Ob = runif(1095,1,5), Sim = runif(1095,1,5)) %>% 
        separate(Date, into = c("Year", "Month", "Day"))

【问题讨论】:

  • 您不能同时拥有月份值 = 11。我认为&amp; (AND) 应该是 | (OR)。

标签: r dataframe if-statement tidyverse lubridate


【解决方案1】:

首先将Month 转换为数字,以便您可以比较这些值。接下来,当Month &lt;= 2 OR &gt;= 11 时,您可以将ObSim 列的值更改为常量。

DF$Month <- as.numeric(DF$Month)
DF[DF$Month <= 2 |  DF$Month >= 11, c('Ob', 'Sim')] <- -1.23

或者使用%in%

DF[DF$Month %in% c(1,2,11,12), c('Ob', 'Sim')] <- -1.23

如果你想使用dplyr,你可以这样做:

library(dplyr)
DF <- DF %>% 
       mutate(across(c(Ob, Sim), ~replace(., Month %in% c(1, 2, 11, 12), -1.23)))

【讨论】:

  • 使用Month %in% c(1,2,11,12) 并更改值怎么样?我们可以在不退出管道(%&gt;%)运营商的情况下更改这些月份的值吗?
【解决方案2】:

有几个问题需要解决。一种是将月份和日期设为数字,以便您可以在它们上使用等于和大于/小于运算符。一旦你有了它,使用case_when 来执行你的替换逻辑。第三个问题是=&lt; 不是一个有效的函数。你应该使用&lt;=。最后,Month &lt;= 2 &amp; Month &gt;= 11 将返回 0 行,因为没有行可以为这两个子句返回 TRUE。我在示例中使用了不同的标准。

library(tidyverse)
library(lubridate)

set.seed(123)

DF <- tibble(Date = seq(ymd("2001-01-01"), to = ymd("2003-12-31"), by = "day"),
             Ob = runif(1095,1,5),
             Sim = runif(1095,1,5)) %>% 
  mutate(Year = year(Date),
         Month = month(Date),
         Day = mday(Date))

DF %>% 
  mutate(Ob = case_when(Month <= 10 & Month >= 6 ~ -1.23,
                        TRUE ~ Ob),
         Sim = case_when(Month <= 10 & Month >= 6 ~ -1.23,
                        TRUE ~ Sim)) %>% 
  filter(Month <= 10 & Month >= 6)

# A tibble: 6 x 6
  Date          Ob   Sim  Year Month   Day
  <date>     <dbl> <dbl> <dbl> <dbl> <int>
1 2001-06-01 -1.23 -1.23  2001     6     1
2 2001-06-02 -1.23 -1.23  2001     6     2
3 2001-06-03 -1.23 -1.23  2001     6     3
4 2001-06-04 -1.23 -1.23  2001     6     4
5 2001-06-05 -1.23 -1.23  2001     6     5
6 2001-06-06 -1.23 -1.23  2001     6     6

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2021-09-22
    • 2019-08-07
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多