【问题标题】:R: Expand dataframe rowsR:展开数据框行
【发布时间】:2016-06-05 17:56:30
【问题描述】:

给定一个 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])))}

看起来很笨拙。也许像 reshape2splitstackshape 这样的包会帮助我?

【问题讨论】:

  • 你也可以做splitstackshape::expandRows(df, c(diff(df$X), 1), FALSE) 然后修复X 列什么的
  • 或基本 R 选项transform(df[rep(1:nrow(df), c(diff(df$X),1)),], X= seq(max(df$X)))

标签: r loops dataframe expand


【解决方案1】:

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

【讨论】:

  • 完美。我忘了 tidyr。
  • df %&gt;% complete(X = full_seq(min(X):max(X), 1)) %&gt;% fill(Y)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多