【问题标题】:Replace values over threshold with values from another column用另一列中的值替换超过阈值的值
【发布时间】:2021-10-29 05:31:20
【问题描述】:

我的数据比下面显示的数据大得多(仅作为示例)。

Code <- c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B")

Date <- as.Date(c("2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05", "2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05"))

Max <- c(2.4, 4.2, 3.7, 10.6, 5.2, 8.7, 3.9, 4.8, 14.5, 3.2)

Mean <- c(2.2, 3.9, 3.1, 5.3, 4.3, 4.8, 3.6, 4.2, 6.0, 2.8)

Limit <- c(6.5, 6.5, 6.5, 6.5, 6.5, 10.5, 10.5, 10.5, 10.5, 10.5)

df <- data.frame(Code, Date, Max, Mean, Limit)

我想做的是将大于Limit 的任何Max 值替换为Mean 值,但仅限于Code == "A"。 所以在本例中,第四个最大值 (10.6) 将替换为 5.3。

我一直在努力解决这个问题,但我相信这里的很多人可以提供帮助!

我尝试将代码 A 和 B 分离到它们自己的数据框中并替换它们,但我想不出办法来做到这一点。我还尝试使用 mutate 创建一个新列,其中包含 ifelse 语句,但无法解决。

我主要使用dplyr,所以如果你能用它来解释,那就太好了!非常感谢,如果您需要更多信息,请告诉我,我会添加它。

【问题讨论】:

    标签: r dataframe replace dplyr


    【解决方案1】:
    df %>% 
      #Condition for Code = "A" and Max  > Limit
      mutate(
        Max = if_else(Code == "A" & Max > Limit, Mean, Max)
      )
       Code       Date  Max Mean Limit
    1     A 2018-01-01  2.4  2.2   6.5
    2     A 2018-01-02  4.2  3.9   6.5
    3     A 2018-01-03  3.7  3.1   6.5
    4     A 2018-01-04  5.3  5.3   6.5
    5     A 2018-01-05  5.2  4.3   6.5
    6     B 2018-01-01  8.7  4.8  10.5
    7     B 2018-01-02  3.9  3.6  10.5
    8     B 2018-01-03  4.8  4.2  10.5
    9     B 2018-01-04 14.5  6.0  10.5
    10    B 2018-01-05  3.2  2.8  10.5
    

    【讨论】:

    • 完美运行!非常感谢!
    【解决方案2】:

    base R

    i1 <- with(df, Max > Limit & Code == 'A')
    df$Max[i1] <- df$Mean[i1]
    

    【讨论】:

      【解决方案3】:

      这是一个data.table 选项

      > setDT(df)[Code == "A" & Max > Limit, Max := Mean][]
          Code       Date  Max Mean Limit
       1:    A 2018-01-01  2.4  2.2   6.5
       2:    A 2018-01-02  4.2  3.9   6.5
       3:    A 2018-01-03  3.7  3.1   6.5
       4:    A 2018-01-04  5.3  5.3   6.5
       5:    A 2018-01-05  5.2  4.3   6.5
       6:    B 2018-01-01  8.7  4.8  10.5
       7:    B 2018-01-02  3.9  3.6  10.5
       8:    B 2018-01-03  4.8  4.2  10.5
       9:    B 2018-01-04 14.5  6.0  10.5
      10:    B 2018-01-05  3.2  2.8  10.5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        相关资源
        最近更新 更多