【问题标题】:Create indicator创建指标
【发布时间】:2014-02-19 00:59:49
【问题描述】:

我想为矩阵创建一个数字指标,这样对于一个变量中的每个唯一元素,它会根据另一个变量中的元素创建一个长度序列。例如:

frame<- data.frame(x = c("a", "a", "a", "b", "b"), y = c(3,3,3,2,2))
frame
  x y
1 a 3
2 a 3
3 a 3
4 b 2
5 b 2

指标 z 应如下所示:

  x y z
1 a 3 1
2 a 3 2
3 a 3 3
4 b 2 1
5 b 2 2

非常感谢任何和所有帮助。谢谢。

【问题讨论】:

  • 这是代表 x、y 还是两者的指标?

标签: r matrix indicator


【解决方案1】:

没有ave

frame$z <- with(frame, ave(y,x,FUN=seq_along) )
frame

#  x y z
#1 a 3 1
#2 a 3 2
#3 a 3 3
#4 b 2 1
#5 b 2 2

data.table 版本可能如下所示(感谢@mnel):

#library(data.table)
#frame <- as.data.table(frame)
frame[,z := seq_len(.N), by=x]

我最初的想法是使用:

frame[,z := .SD[,.I], by=x]

其中.SD 指的是data.table 拆分by x 的每个子集。 .I 返回整个 data.table 的行号。因此,.SD[,.I] 返回每​​个组中的行号。尽管正如@mnel 指出的那样,与其他方法相比,这种方法效率低下,因为需要将整个.SD 加载到内存中,以便每个组运行此计算。

【讨论】:

  • 不要使用.SD[,.I],使用z := seq_len(.N)。对于.SD 很大的情况,后者的内存(和时间)效率更高
  • 嗯,[,.I] 仅适用于 .SD,而不适用于任何任意列集。我怀疑.SD 魔术背后有一些合并。
  • @ScottRitchie .SD[,.I] 起作用的原因是因为在这个.I 的范围内是.SD,例如参见frame[, c('z1','z2') := list(.I,.SD[,.I]),by=x]
【解决方案2】:

另一种方法:

frame$z <- unlist(lapply(rle(as.numeric(frame[, "x"]))$lengths, seq_len))

【讨论】:

  • sequence(rle(as.numeric(frame$x))$lengths) 对我来说似乎更直接。 rle 方法的一个可能问题(或优势,取决于 OP 想要什么)是需要首先对数据进行排序,否则每次“x”中的值发生变化时都会重置序列。
  • @Ananda 我认为这实际上是 OP 想要的,但事实可能并非如此。
【解决方案3】:
library(dplyr)
frame %.%
  group_by(x) %.%
  mutate(z = seq_along(y))

【讨论】:

  • 打得好先生打得好+1
  • @TylerRinker,不太好。另外两个解决方案需要x订购的数据
【解决方案4】:

您可以在x 上拆分data.frame,并在此基础上生成一个新的id 列:

> frame$z <- unlist(lapply(split(frame, frame$x), function(x) 1:nrow(x)))
> frame
  x y z
1 a 3 1
2 a 3 2
3 a 3 3
4 b 2 1
5 b 2 2

或者更简单地使用data.table

library(data.table)
frame <- data.table(frame)[,z:=1:nrow(.SD),by=x]

【讨论】:

  • 你可以用1:nrow(.SD)代替.N (data.table(frame)[,z:=sequence(.N),by=x])
  • 引用.SD 会将整个.SD 加载到内存中。请改用z:=seq_len(.N)
【解决方案5】:

试试这个,其中x 是要进行分组的列,y 是任何数字列。如果没有数字列,请使用seq_along(x),例如,代替y

transform(frame, z = ave(y, x, FUN = seq_along))

【讨论】:

  • 打败你... :-)
  • 是的,我也很惊讶即使几分钟后也没有人建议ave
猜你喜欢
  • 2011-09-03
  • 2011-09-18
  • 2019-12-15
  • 1970-01-01
  • 2012-12-09
  • 2017-10-29
  • 2020-08-22
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多