【问题标题】:How to select and repeat a number of rows in a dataframe in r如何在r中选择并重复数据框中的多行
【发布时间】:2021-03-29 00:54:13
【问题描述】:

我相信我的问题很简单,但我无法找到正确的答案。

在任何给定的数据框中:

> data.frame(x0=c(1,2,3,4), x1=rnorm(4))
  x0         x1
1  1 -0.1868765
2  2 -0.2935534
3  3 -1.3934953
4  4  0.8165035

想象一下,我想每两行重复两次,结果是这样的:

> data.frame(x0=c(1,2,3,4), x1=rnorm(4))
  x0         x1
1  1 -0.1868765
2  2 -0.2935534
3  1 -0.1868765
4  2 -0.2935534
5  3 -1.3934953
6  4  0.8165035
7  3 -1.3934953
8  4  0.8165035


最简单的方法是什么?

提前致谢!

【问题讨论】:

  • 这将是另一种选择:c(do.call(rbind, replicate(2, matrix(seq_len(nrow(your_data)), 2), simplify = FALSE)))
  • 试过了,效果也很好,谢谢!

标签: r rep


【解决方案1】:

您可以创建 2 行组并为每个组重复两次,取消列出索引和子集。

set.seed(123)
df <- data.frame(x0=c(1,2,3,4), x1=rnorm(4))

inds <- seq(nrow(df))
df[unlist(tapply(inds, ceiling(inds/2), rep, 2)), ]

#    x0          x1
#1    1 -0.56047565
#2    2 -0.23017749
#1.1  1 -0.56047565
#2.1  2 -0.23017749
#3    3  1.55870831
#4    4  0.07050839
#3.1  3  1.55870831
#4.1  4  0.07050839

【讨论】:

  • 就是这样,这真的很成功!非常感谢:)
  • 虽然我实际上认为它会更简单,但我不得不承认。
【解决方案2】:

实际上,您可以使用rep 来做到这一点。

d[rep(seq(nrow(d)), each=2), ]
# x0          x1
# 1    1 -0.56047565
# 1.1  1 -0.56047565
# 2    2 -0.23017749
# 2.1  2 -0.23017749
# 3    3  1.55870831
# 3.1  3  1.55870831
# 4    4  0.07050839
# 4.1  4  0.07050839

数据:

d <- structure(list(x0 = c(1, 2, 3, 4), x1 = c(-0.560475646552213, 
-0.23017748948328, 1.55870831414912, 0.070508391424576)), class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

  • 我喜欢这个。虽然它不完全是 OP 想要的。他想要 1 和 2 重复,然后 3 和 4 等等,而不是 1 重复,2 重复等等。不确定,这是否会对他产生影响。
【解决方案3】:

我们可以使用uncount

library(dplyr)
library(tidyr)
df %>% 
   uncount(2) %>%
   as_tibble

-输出

# A tibble: 8 x 2
#     x0      x1
#  <dbl>   <dbl>
#1     1 -0.560 
#2     1 -0.560 
#3     2 -0.230 
#4     2 -0.230 
#5     3  1.56  
#6     3  1.56  
#7     4  0.0705
#8     4  0.0705

数据

set.seed(123)
df <- data.frame(x0=c(1,2,3,4), x1=rnorm(4))

【讨论】:

  • 谢谢阿克伦!出于好奇,我看到 2 是估计行数的参数,那么重复呢?如果我想重复这两行,例如 5 次怎么办?事实上,这是一个问题,在您的提案中,结果并不完全是我们想要的。
  • @UnaiVicente 如果您想重复 5 次,请将 2 更改为 5。这是您的问题吗?
  • 不,如果您仔细查看我的示例,您会发现需要两种不同的规范,您的建议仅考虑 1。因此,它不符合我的要求。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多