【问题标题】:Operation on a column with filtering in R在 R 中对带有过滤的列进行操作
【发布时间】:2018-08-23 06:39:16
【问题描述】:

我有一个简单的问题:假设我想根据另一列的值(在这种情况下 Unit 等于 L)对一列进行操作(在本例中乘以 1000 列度量) .

有什么有效的方法吗?

我将报告一个简单的示例,但您不必专注于更改第二列的值的名称。

输入:

a <- data.frame(Measure = c(10, 2000, 10000, 15, 40), 
                Unit = c("L","mL","mL","L","L"), 
                Price = c(100, 200, 500, 700, 900 ))

预期输出:

b <- data.frame(Measure = c(10000, 2000, 10000, 15000, 40000), 
                Unit = c("mL","mL","mL","mL","mL"), 
                Price = c(100, 200, 500, 700, 900 ))

【问题讨论】:

    标签: r dplyr data.table data-manipulation tidyr


    【解决方案1】:

    使用下面的代码,您只能在 Unit 为“L”时将 Measure 乘以 1000;在所有其他情况下,仅返回 Measure 值而不进行乘法

    a <- data.frame(Measure = c(10, 2000, 10000, 15, 40), 
                Unit = c("L","mL","mL","L","L"), 
                Price = c(100, 200, 500, 700, 900 ))
    
    
    
     a$Measure <- ifelse(a$Unit == "L", a$Measure * 1000, a$Measure)
     a
       Measure Unit Price
     1   10000    L   100
     2    2000   mL   200
     3   10000   mL   500
     4   15000    L   700
     5   40000    L   900
    

    【讨论】:

    • 当您添加以下代码时,所有行上的单位都将为“ml”:a$Unit
    【解决方案2】:

    同上,只是tidyverse/dplyr方式:

    > library(dplyr)
    > a %>% mutate(Measure=ifelse(Unit=="mL",Measure,(Measure*1000)))
      Measure Unit Price
    1   10000    L   100
    2    2000   mL   200
    3   10000   mL   500
    4   15000    L   700
    5   40000    L   900
    

    【讨论】:

      【解决方案3】:
      library(data.table)
      DT = data.table(a)
      
      DT[Unit == "L", `:=`(Measure = Measure * 1000, Unit = "mL")]
      
         Measure Unit Price
      1:   10000   mL   100
      2:    2000   mL   200
      3:   10000   mL   500
      4:   15000   mL   700
      5:   40000   mL   900
      

      语法是DT[i, j]:

      1. 使用i过滤到行
      2. j

      := 函数用于编辑列。

      【讨论】:

        猜你喜欢
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        • 2020-01-30
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多