将数据框的列中的所有负值更改为零

时间:2014-06-04 20:03:51

标签: r

在R中,如何将数据框列中的所有负值更改为零?是否有一个简单的函数可以与apply()一起使用来完成这项工作?或者,如何编写循环来做到这一点?非常感谢你!

4 个答案:

答案 0 :(得分:7)

您可以使用ifelse命令:

df$column <- ifelse(df$column < 0, 0, df$column)

或@Jilber在评论中说:

df$column[df$column < 0] <- 0

within(df, column[column<0] <- 0)

答案 1 :(得分:1)

可能更容易使用@Jaap建议的ifelse语句或建议的索引,但我觉得这个方法很有趣(利用布尔代数)

> dat<-data.frame(c1=sample(c(10,-10),10,T))
> dat
    c1
1  -10
2   10
3  -10
4   10
5   10
6   10
7  -10
8   10
9   10
10 -10
> dat<-within(dat, c1<-c1*(c1>0))
> dat
   c1
1   0
2  10
3   0
4  10
5  10
6  10
7   0
8  10
9  10
10  0

在这种情况下,它还可以提供超过ifelse /索引的性能提升(当然,这种灵活性要低得多,所以在所有情况下性能提升都不值得)

> dat<-data.frame(c1=sample(c(10,-10),1e6,T))
> system.time(within(dat, c1<-ifelse(c1 < 0, 0, c1)))
   user  system elapsed
  0.382   0.000   0.386
> system.time(dat[dat$c1 < 0,] <- 0)
   user  system elapsed
   0.08    0.00    0.08
> system.time(within(dat, c1<-c1*(c1>0)))
   user  system elapsed
  0.043   0.000   0.044
> dat1<-within(dat, c1<-ifelse(c1 < 0, 0, c1))
> dat2<-within(dat, c1<-c1*(c1>0))
> identical(dat1,dat2)
[1] TRUE

答案 2 :(得分:0)

您可以使用以下内容快速制作整个数据框

dat[dat < 0] = 0

答案 3 :(得分:0)

使用dplyr

library(dplyr)

> df <- tibble(c1 = sample(c(10, -10), 10, T))
> df
# A tibble: 10 x 1
      c1
   <dbl>
 1    10
 2   -10
 3    10
 4   -10
 5   -10
 6    10
 7    10
 8   -10
 9   -10
10    10

> df %>% mutate(c1 = if_else(c1 < 0, 0, c1))
# A tibble: 10 x 1
      c1
   <dbl>
 1    10
 2     0
 3    10
 4     0
 5     0
 6    10
 7    10
 8     0
 9     0
10    10