我想在每次N的时候重复data.frame的行数。结果应该是一个新的data.frame (带有nrow(new.df) == nrow(old.df) * N),它保留了列的数据类型。
N=2的示例:
A B C
A B C 1 j i 100
1 j i 100 --> 2 j i 100
2 K P 101 3 K P 101
4 K P 101因此,每行重复2次,字符仍然是字符,因子仍然是因子,数字仍然是数字,...
我的第一次尝试使用了apply:apply(old.df, 2, function(co) rep(co, each = N)),但这一次将我的值转换为字符,并得到:
A B C
[1,] "j" "i" "100"
[2,] "j" "i" "100"
[3,] "K" "P" "101"
[4,] "K" "P" "101"发布于 2012-06-20 22:09:11
df <- data.frame(a = 1:2, b = letters[1:2])
df[rep(seq_len(nrow(df)), each = 2), ]发布于 2017-12-13 03:53:48
取自here的干净的dplyr解决方案
library(dplyr)
df <- tibble(x = 1:2, y = c("a", "b"))
df %>% slice(rep(1:n(), each = 2))发布于 2018-09-13 08:49:37
有一个可爱的矢量化解决方案,它只重复某些行n次,例如可以通过向数据框添加ntimes列:
A B C ntimes
1 j i 100 2
2 K P 101 4
3 Z Z 102 1方法:
df <- data.frame(A=c("j","K","Z"), B=c("i","P","Z"), C=c(100,101,102), ntimes=c(2,4,1))
df <- as.data.frame(lapply(df, rep, df$ntimes))结果:
A B C ntimes
1 Z Z 102 1
2 j i 100 2
3 j i 100 2
4 K P 101 4
5 K P 101 4
6 K P 101 4
7 K P 101 4这与Josh O‘’Brien和Mark Miller的方法非常相似:
df[rep(seq_len(nrow(df)), df$ntimes),]然而,这种方法看起来要慢得多:
df <- data.frame(A=c("j","K","Z"), B=c("i","P","Z"), C=c(100,101,102), ntimes=c(2000,3000,4000))
microbenchmark::microbenchmark(
df[rep(seq_len(nrow(df)), df$ntimes),],
as.data.frame(lapply(df, rep, df$ntimes)),
times = 10
)结果:
Unit: microseconds
expr min lq mean median uq max neval
df[rep(seq_len(nrow(df)), df$ntimes), ] 3563.113 3586.873 3683.7790 3613.702 3657.063 4326.757 10
as.data.frame(lapply(df, rep, df$ntimes)) 625.552 654.638 676.4067 668.094 681.929 799.893 10https://stackoverflow.com/questions/11121385
复制相似问题