【问题标题】:Using an if statement to modify data in a column in R [duplicate]使用if语句修改R中列中的数据[重复]
【发布时间】:2023-03-04 08:30:01
【问题描述】:

我的数据如下所示:

Person Change
1       10 
2       0.5
3       -0.25
4       5
5       -20

我想说的是,如果Change

Person Change
1       10 
2       50
3       -25
4       5
5       -20

我试过一个 if 公式说

if(df$Change <1 && df$Change > 0 {
df$Change*100
}

这运行良好,但不会对数据进行任何更改,我不确定还可以尝试什么。

【问题讨论】:

    标签: r dataframe if-statement


    【解决方案1】:

    您可以使用ifelse() 来检查Change (abs()) 的绝对值是否低于1

    df$Change <- ifelse(abs(df$Change) < 1, df$Change * 100, df$Change)
    
    df
    #>   Person Change
    #> 1      1     10
    #> 2      2     50
    #> 3      3    -25
    #> 4      4      5
    #> 5      5    -20
    

    或者使用条件作为索引:

    df_condition = abs(df$Change) < 1
    df$Change[df_condition] <- df$Change[df_condition] * 100
    
    df
    #>   Person Change
    #> 1      1     10
    #> 2      2     50
    #> 3      3    -25
    #> 4      4      5
    #> 5      5    -20
    

    或者使用replace():

    df_condition = abs(df$Change) < 1
    df$Change <- replace(df$Change, df_condition, df$Change[df_condition] * 100)
    
    df
    #>   Person Change
    #> 1      1     10
    #> 2      2     50
    #> 3      3    -25
    #> 4      4      5
    #> 5      5    -20
    

    基准测试

    似乎条件是最快的解决方案,然后是replace(),然后是ifelse()

    Unit: microseconds
          expr  min   lq    mean median   uq   max neval
        ifelse 25.9 28.7 29.9806  29.60 30.7  67.2  1000
     condition 20.6 22.7 23.7826  23.60 24.5  48.6  1000
       replace 21.3 23.5 24.7224  24.35 25.3 129.4  1000
    

    数据

    df <- structure(list(Person = 1:5, Change = c(10, 0.5, -0.25, 5, -20
    )), class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

      【解决方案2】:

      如果您不介意将数据框更改为数据表,您可以使用以下简单的解决方案。

      您必须安装并导入 data.table 包

      dt <- as.data.table(df)
      dt[ abs(change) < 1 , change := change*100 ]
      
      

      【讨论】:

        猜你喜欢
        • 2013-05-06
        • 1970-01-01
        • 2015-01-26
        • 2021-06-01
        • 1970-01-01
        • 2020-09-28
        • 2015-09-17
        • 2021-03-16
        • 1970-01-01
        相关资源
        最近更新 更多