【问题标题】:Conditionally modify all numeric values in R dataframe?有条件地修改 R 数据框中的所有数值?
【发布时间】:2018-02-16 12:06:41
【问题描述】:

我有一个如下所示的 R 数据框,其中包含所有数字列。所有非 NA 值都大于/等于 1 或小于 -1。我想从所有正值中减去 1 并将所有负值加 1,忽略所有 NA。

我的输出数据框应该如下所示

我知道如何用零替换 NA,反之亦然

df[is.na(df)] <- 0
df[df==0] <- NA

我也尝试了类似的方法来解决我的问题

df[df >= 1] <- df - 1
df[df < -1] <- df + 1

得到一个错误'value'的长度错误。 ifelse也试过了

df <- ifelse(df >= 1, df - 1, df + 1)

这是从所有值(包括负数)中减去 1。 也分别尝试了 if 和 else

if(df >= 1){
   df <- df - 1
}else if(df < -1){
   df <- df + 1
}

这也是从所有中减去 1。我以前用其他语言编程过,对 R 比较陌生。在这方面需要帮助。我的实际数据框有 1000 多列。

我找到了一个类似的question on stackoverflow,但答案是使用特定的列索引,这在我的情况下是不可能的。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你可以试试

    sapply(df, function(x) ifelse(x >= 1, x - 1, x + 1))
    #     col1 col2 col3
    #[1,] -0.4  1.1   NA
    #[2,]  0.2 -1.0  0.5
    #[3,]   NA   NA  0.0
    

    数据

    df <- data.frame(col1 = c(-1.4, 1.2, NA), col2 = c(2.1, -2, NA), col3 = c(NA, 1.5, 1))
    

    【讨论】:

      【解决方案2】:

      或者使用tidyverse函数,你可以试试:

      df %>%
        mutate_all(funs(if_else( .>1, . -1, . +1)))
      

      给出:

        col1 col2 col3
      1 -0.4  1.1   NA
      2  0.2 -1.0  0.5
      3   NA   NA  2.0
      

      【讨论】:

      • 我的数据集非常慢。另外,它需要一个额外的包。其他答案中提到的 sapply(df, function(x) ifelse(x >= 1, x - 1, x + 1)) 似乎是更好的选择。谢谢
      猜你喜欢
      • 2020-02-09
      • 2017-09-06
      • 2021-10-15
      • 1970-01-01
      • 2016-08-18
      • 2021-04-18
      • 2015-09-24
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多