2017-01-04 27 views
4

我有一個數據幀有10個項目,我想否定偶數行。我想出了這個怪物:r數據幀中偶數行的反轉符號

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 ] 

有沒有更好的方法?

+11

只是'change_even $ VAL * C(1,-1)'。 – nicola

+1

@nicola實際上得到了最好的答案,使得愚蠢的R向量回收規則看起來像一個特徵哈哈:) –

+3

@災難性失敗愚蠢?這是R IMO最偉大的事情之一。 – nicola

回答

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 

(由於未設置種子,因此值不可重複;然而交替的標誌可以清楚地看到)。

3

你可以簡單地做,

change_even[c(FALSE,TRUE),] <- change_even[c(FALSE,TRUE),]*(-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,] 
1

這是我想出了:

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