Invert even line sign to r dataframe

I have a data frame with 10 elements and I want to negate even rows. I came up with this monster:

change_even <- data.frame(val=runif(10))
change_even$val[row(  as.matrix(change_even[,'val']) ) %% 2 == 0 ] <- -change_even$val[row(  as.matrix(change_even[,'val']) ) %% 2 == 0 ]

is there a better way?

+4
source share
6 answers

You can simply use recycling:

change_even$val*c(1,-1)
#[1]  0.1077468 -0.5418167  0.8319609 -0.7230043  0.6649786 -0.7232669
#[7]  0.2677659 -0.4035824  0.6880934 -0.5600653

(values ​​are not reproduced since the seed has not been established, however the alternating sign can be seen clearly).

+8
source

You can just do

change_even[c(FALSE,TRUE),] <- change_even[c(FALSE,TRUE),]*(-1)
+3
source

data.table data.frame. / dataframe R

library(data.table)   
change_even <- data.table(val=runif(10))
even_indexes<-seq(2,nrow(change_even),2)
change_even <- change_even[even_indexes,val:=val*-1]
+2

,

change_even <- data.frame(val=runif(10))
change_even[seq(nrow(change_even)) %% 2 != 1,] = -change_even[seq(nrow(change_even)) %% 2 != 1,]
+2

:

change_even$val = change_even$val * c(rep(-1,nrow(change_even))^((row(change_even)+1)))
+1

:

(-1)^(0:(nrow(change_even)-1))*change_even$val
+1
source

Source: https://habr.com/ru/post/1665759/


All Articles