【问题标题】:How to generate an uneven sequence of numbers in R如何在R中生成不均匀的数字序列
【发布时间】:2015-08-29 03:16:33
【问题描述】:

这是一个示例数据框:

df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2))

我想根据每个x 组的y 的观察次数生成一个数字序列(例如,x=1 有两个y 的观察)。我希望序列在每个x 组之后不断增加并跳2。

这个例子的期望输出是:

1,2,5,6,7,10,11,14,17,20,21,22,25,26

我怎样才能在 R 中简单地做到这一点?

【问题讨论】:

  • 如果它们已经分组,并按照您显示的方式进行标记,您不能将其作为df$rowname &lt;- 1:dim(df)[1];df$newNumber &lt;- df$rowname + (df$x-1)*2 运行,而df$newNumber 将是所需的输出吗?
  • @chappers 感谢这个想法,但是我正在寻找一个通用的解决方案,我刚刚意识到我的 x 是顺序的,可以通过这个来解决,但 x 真的可以是任何值跨度>
  • 扩展@chappers 的想法,library(data.table); setDT(df)[, gr:= .GRP, x][, 1:.N + (gr-1)*2]#[1] 1 2 5 6 7 10 11 14 17 20 21 22 25 26
  • @xyy 这实际上并不重要,因为您可以将一个因子转换为数字...
  • 或使用base R, (with(df, match(x, unique(x)))-1)*2 + 1:nrow(df)

标签: r sequence


【解决方案1】:

为了扩展我的评论,分组可以是任意的,您只需将其重新转换为正确的顺序即可。有几种方法可以做到这一点,@akrun 已经证明可以使用match 函数来完成,或者如果你自己更容易理解,你可以使用as.numeric 函数。

df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2))

# these are equivalent
df$newx <- as.numeric(factor(df$x, levels=unique(df$x)))
df$newx <- match(df$x, unique(df$x))

由于您现在有一个“新”的顺序重新调平,我们可以使用 cmets 中讨论的逻辑。

df$newNumber <- 1:nrow(df) + (df$newx-1)*2

对于本例,这将产生以下数据框:

x y newx newNumber
1 1    1         1
1 2    1         2
2 3    2         5
2 4    2         6
2 6    2         7
3 3    3        10
3 7    3        11
4 8    4        14
5 6    5        17
6 4    6        20
6 3    6        21
6 7    6        22
9 3    7        25
9 2    7        26

df$newNumber 是你想要的输出。


要创建序列0,0,4,4,4,9,...,基本上你要做的就是取每个组的最小值并减去1。最简单的方法是使用library(dplyr)

library(dplyr)
df %>% 
  group_by(x) %>%
  mutate(newNumber2 = min(newNumber) -1)

哪个会有输出:

Source: local data frame [14 x 5]
Groups: x

   x y newx newNumber newNumber2
1  1 1    1         1          0
2  1 2    1         2          0
3  2 3    2         5          4
4  2 4    2         6          4
5  2 6    2         7          4
6  3 3    3        10          9
7  3 7    3        11          9
8  4 8    4        14         13
9  5 6    5        17         16
10 6 4    6        20         19
11 6 3    6        21         19
12 6 7    6        22         19
13 9 3    7        25         24
14 9 2    7        26         24

【讨论】:

  • 谢谢你们!我想知道您是否有其他天才的方法从与上述相同的数据中获取序列0,0,4,4,4,9,9,13,16,19,19,19,24,24
  • 查看我的编辑。在 Base R 中可能有办法做到这一点,但 dplyr 是我最初的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多