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