我正在尝试使用下面的代码复制数据框中的行。 但是,我发现它很慢。
duprow = df[1,]
for(i in 1:2000)
{
print(i)
df = rbind(df,duprow)
}
有更快的方法吗?
答案 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;通过做
的rownamesrownames(df2) <- 1:2000
答案 3 :(得分:2)
Luke使用rep()
的答案现在可以完成你的工作,但是下面这些答案可能会帮助你从长远来看。
请在speeding up rbind上查看这个答案,了解它为何缓慢且不使用循环。它还具有预分配数据帧的代码。另请参阅jorans Second circle of hell comment。
建议rbind.fill 来自@coanil
我想添加的两件事:1)通常,如果您不想使用data.table,您可以在Hadley的plyr包中使用rbind.fill函数,也很快。永远不要像上面那样使用rbind,因为&#39; for&#39;循环,分别附加每一行。它会强制R在每次追加一行时复制数据框对象,这很慢。
https://stackoverflow.com/a/19699342/4606130
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(...))
使用特定的行号进行复制。