R中数据框中的重复行

tub*_*bby 13 r dataframe

我正在尝试使用下面的代码复制我的数据框中的行。但是,我发现它很慢。

duprow = df[1,]
for(i in 1:2000)
{
    print(i)
    df = rbind(df,duprow)
}
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法?

luk*_*keA 11

您可以使用rep,例如 5 个重复项或第 1 行:

df <- data.frame(x = 1, y = 1)
rbind(df, df[rep(1, 5), ])
#     x y
# 1   1 1
# 11  1 1
# 1.1 1 1
# 1.2 1 1
# 1.3 1 1
# 1.4 1 1
Run Code Online (Sandbox Code Playgroud)


小智 10

这是我的破解:

> # create an example data frame
> colornames=c("violet","indigo","blue","green","yellow","orange","red")
> wavelength=c(400,425,470,550,600,630,665)
> df <- data.frame(colornames, wavelength)
> 
> # How many replicates you want of each row
> duptimes <- c(0,1,2,1,1,4,1)
> 
> # Create an index of the rows you want with duplications
> idx <- rep(1:nrow(df), duptimes)
> 
> # Use that index to genderate your new data frame
> dupdf <- df[idx,]
> 
> # display results
> df
  colornames wavelength
1     violet        400
2     indigo        425
3       blue        470
4      green        550
5     yellow        600
6     orange        630
7        red        665
> dupdf
    colornames wavelength
2       indigo        425
3         blue        470
3.1       blue        470
4        green        550
5       yellow        600
6       orange        630
6.1     orange        630
6.2     orange        630
6.3     orange        630
7          red        665
Run Code Online (Sandbox Code Playgroud)

我不知道这是否更快,但它不需要加载额外的包,也删除不需要的行。

缺点是您需要对数据框中的每一行做出决定,但这不应该太难编码。

  • 这对我来说效果很好,并且使用以 100 万行开头的数据帧速度很快。如果你想对每一行进行相同数量的重复,你可以使用`reptimes &lt;- 12; idx &lt;- rep(1:nrow(df), reptimes); rep_df &lt;- df[idx, ]` (2认同)

Adr*_*gel 5

我有一个类似的问题,我想使用dplyr. 我最终使用dplyr::filter()和根据行号从数据框中过滤了指定行dplyr::row_number()。并使用将它们绑定到原始数​​据帧dplyr::bind_rows(),所有这些都在一个管道中。在你的例子中,它会是这样的:

df %>% 
  filter(row_number() <= 2000) %>% 
  bind_rows(df)
Run Code Online (Sandbox Code Playgroud)

如果您想复制特定行,又快又简单!当然,您可以使用特定的行号进行复制,使用filter(row_number() %in% c(...)).