有条件地修改R数据帧中的所有数值?

时间:2018-02-16 12:06:41

标签: r dataframe

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

Input dataframe

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

Output dataframe

我知道如何用零替换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,但答案是使用特定的列索引,这在我的情况下是不可能的。

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

交替使用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