6

我对 R 很陌生,但对它很鼓励,因为尽管我不是程序员,但我发现它可以访问。我正在尝试解决以下问题:我需要计算一列中值更改标志的次数,然后按路径对结果进行排序(表的示例如下 - 路径是一个因素)。一旦我最终得到它们,我就可以计算出如何对数据进行排序,但还没有计算出 + 符号变为 - 和 - 符号变为 + 1 的次数。有什么建议吗?

Test <- structure(list(Path = c(1L, 1L, 1L, 2L, 2L, 2L), Direction = c(-3.84089, 
-1.12258, 1.47411, -1.47329, 5.4525, 10.161)), .Names = c("Path", 
"Direction"), class = "data.frame", row.names = c(NA, -6L))
head(Test)
#>   Path    Direction
#> 1    1     -3.84089
#> 2    1     -1.12258
#> 3    1      1.47411
#> 4    2     -1.47329
#> 5    2      5.4525
#> 6    2     10.161
4

2 回答 2

13

我想你正在寻找的是

 sum(diff(sign(X)) != 0)

在你的情况下,你试图计算符号变化X的向量在哪里。dat$Direction



如果您想通过 计算Path,您可以使用该by函数,或者将您的转换data.frame为 adata.table并使用内置by功能。

例子:

假设X是你的原件data.frame

# I'm adding another row to the data, just to show that it works 
#    (ie, giving the two Path values a different number of rows)
X <- rbind(X, c(2, -5))

# convert to a data.table
library(data.table)
DT <- data.table(X)

# count the number of changes, per path
DT[, changes := sum(diff(sign(Direction)) != 0), by=Path]

编辑(重新评论factors):

如果Direction是 a factor,则需要先转换为numeric。您可以使用

DT[, Direction := as.numeric(Direction)]

结果:

DT

       Path Direction changes
  1:    1  -3.84089       1
  2:    1  -1.12258       1
  3:    1   1.47411       1
  4:    2  -1.47329       2
  5:    2   5.45250       2
  6:    2  10.16100       2
  7:    2  -5.00000       2
于 2013-06-20T18:38:36.333 回答
2

这是使用signrle贾斯汀建议的一种方法:

length(rle(sign(Test$Direction))[[1]])

编辑
一开始我可能误解了。也许这更接近你想要的:

vals <- tail(rle(sign(Test$Direction))[[-1]], -1)
sum(vals > 0) # neg to pos
sum(vals < 0) # pos to neg
于 2013-06-20T18:21:14.430 回答