我有一个如下所示的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,但答案是使用特定的列索引,这在我的情况下是不可能的。
答案 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