R:扩展数据框行
R: Expand dataframe rows
给定一个 4x2 数据框,例如:
df <-
data.frame(
X=c(1,3,6,10),
Y=c('A','K','K3', 'K'))
我想得到一个 10x2 行的数据框,其中 X
是 1,2,...10(比如 1:10),并且
Y
被复制了df$X中指定的次数,例如:
X Y
1 1 A
2 2 A
3 3 K
4 4 K
5 5 K
6 6 K3
7 7 K3
8 8 K3
9 9 K3
10 10 K
我唯一能想到的就是通过像(伪代码)一样循环'df'来构建Y
:
for(i in 1:(nrow(df)-1)){
Y <- c(Y,(rep.int(df$Y[i], df$X[i+1]-df$X[i])))}
看起来很笨拙。也许像 reshape2
或 splitstackshape
这样的软件包对我有帮助?
我们可以使用dplyr
library(dplyr)
library(tidyr)
data.frame(X= min(df$X):max(df$X)) %>%
left_join(., df, by = "X") %>%
fill(Y)
# X Y
#1 1 A
#2 2 A
#3 3 K
#4 4 K
#5 5 K
#6 6 K3
#7 7 K3
#8 8 K3
#9 9 K3
#10 10 K
给定一个 4x2 数据框,例如:
df <-
data.frame(
X=c(1,3,6,10),
Y=c('A','K','K3', 'K'))
我想得到一个 10x2 行的数据框,其中 X
是 1,2,...10(比如 1:10),并且
Y
被复制了df$X中指定的次数,例如:
X Y
1 1 A
2 2 A
3 3 K
4 4 K
5 5 K
6 6 K3
7 7 K3
8 8 K3
9 9 K3
10 10 K
我唯一能想到的就是通过像(伪代码)一样循环'df'来构建Y
:
for(i in 1:(nrow(df)-1)){
Y <- c(Y,(rep.int(df$Y[i], df$X[i+1]-df$X[i])))}
看起来很笨拙。也许像 reshape2
或 splitstackshape
这样的软件包对我有帮助?
我们可以使用dplyr
library(dplyr)
library(tidyr)
data.frame(X= min(df$X):max(df$X)) %>%
left_join(., df, by = "X") %>%
fill(Y)
# X Y
#1 1 A
#2 2 A
#3 3 K
#4 4 K
#5 5 K
#6 6 K3
#7 7 K3
#8 8 K3
#9 9 K3
#10 10 K