R中数据框中的重复行

时间:2015-04-20 09:14:09

标签: r dataframe

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

duprow = df[1,]
for(i in 1:2000)
{
    print(i)
    df = rbind(df,duprow)
}

有更快的方法吗?

5 个答案:

答案 0 :(得分:4)

这是我的主意:

import glob
files = glob.glob('*.txt')
for f in files:
   with open(f, 'rt') as reader:
       with open(f+'.2', 'wt') as writer:
          for line in reader:
              writer.write("\t".join(line.split()[2:]) + "\n") #your logic not mine
   os.remove(f)
   os.rename(f+'.2', f)

我不知道这样做是否更快,但是不需要加载其他软件包,也可以删除不需要的行。

缺点是您需要对数据帧中的每一行做出决策,但这并不难于编写代码。

答案 1 :(得分:3)

您可以使用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

答案 2 :(得分:3)

昨天我遇到了类似的问题,还有一个名为&#39; splitstackshape&#39;的软件包。然后它就像下面的代码一样简单:

library(splitstackshape)
df <- data.frame(x = 1, y = 1)
df2 <- expandRows(df, count=2000, count.is.col=FALSE)

您可能还想修复&#39;通过做

的rownames
rownames(df2) <- 1:2000

答案 3 :(得分:2)

Luke使用rep()的答案现在可以完成你的工作,但是下面这些答案可能会帮助你从长远来看。

  1. 请在speeding up rbind上查看这个答案,了解它为何缓慢且不使用循环。它还具有预分配数据帧的代码。另请参阅jorans Second circle of hell comment

  2. 建议rbind.fill 来自@coanil

      

    我想添加的两件事:1)通常,如果您不想使用data.table,您可以在Hadley的plyr包中使用rbind.fill函数,也很快。永远不要像上面那样使用rbind,因为&#39; for&#39;循环,分别附加每一行。它会强制R在每次追加一行时复制数据框对象,这很慢。

  3. https://stackoverflow.com/a/19699342/4606130

    1. 如果您转到data.table路线,请使用更快的 rbindlist 。 (@David在第一个答案链接中建议这一点。)

答案 4 :(得分:1)

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

df %>% 
  filter(row_number() <= 2000) %>% 
  bind_rows(df)

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