Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r数据帧中偶数行的反转符号_R_Dataframe - Fatal编程技术网

r数据帧中偶数行的反转符号

r数据帧中偶数行的反转符号,r,dataframe,R,Dataframe,我有一个包含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 ] change\u甚至你可以简单地做 change_even[c

我有一个包含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 ]
change\u甚至你可以简单地做

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

change_甚至[c(FALSE,TRUE),]对于data.table,您可以使用data.frame获得类似的结果。类似于这里

库(data.table)

change_偶数使用余数运算符查找偶数行,然后简单地求反

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

change\u甚至这就是我想到的:

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

您只需使用回收:

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)^(0:(nrow(change_even)-1))*change_even$val

只是
change\u甚至$val*c(1,-1)
@nicola实际上得到了最好的答案,使愚蠢的R向量回收规则看起来像一个功能哈哈:)@灾难性失败愚蠢?这是R IMO最伟大的事情之一。如果@nicola的回答是一个答案,我会接受它。@nicola Recycling在很多情况下都很方便(比如这次),但我永远不会依赖它。这实际上使调试更加困难,因为不同长度的向量相乘是有效的,所以您必须以某种方式捕获它。至少它不应该是默认行为。
(-1)^(0:(nrow(change_even)-1))*change_even$val