我正在尝试使用下面的代码复制我的数据框中的行。但是,我发现它很慢。
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)
我不知道这是否更快,但它不需要加载额外的包,也删除不需要的行。
缺点是您需要对数据框中的每一行做出决定,但这不应该太难编码。
我有一个类似的问题,我想使用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(...)).