我有一个包含10个项目的数据框,我想要否定偶数行。我想出了这个怪物:
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 ]
有更好的方法吗?
答案 0 :(得分:8)
只需使用回收:
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
(由于没有设置种子,因此值不可重复;但是可以清楚地看到交替的符号。)
答案 1 :(得分:3)
你可以这样做,
change_even[c(FALSE,TRUE),] <- change_even[c(FALSE,TRUE),]*(-1)
答案 2 :(得分:2)
使用data.table,您可以获得与data.frame类似的内容。与此类似Selecting multiple odd or even columns/rows for dataframe in 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]
答案 3 :(得分:2)
使用余数运算符查找偶数行,然后简单地否定
change_even <- data.frame(val=runif(10))
change_even[seq(nrow(change_even)) %% 2 != 1,] = -change_even[seq(nrow(change_even)) %% 2 != 1,]
答案 4 :(得分:1)
这就是我提出的:
change_even$val = change_even$val * c(rep(-1,nrow(change_even))^((row(change_even)+1)))
答案 5 :(得分:1)
另一个:
(-1)^(0:(nrow(change_even)-1))*change_even$val