【问题标题】:Replicate each row of select variables n times in data.frame在 data.frame 中复制每行选择变量 n 次
【发布时间】:2018-07-21 17:17:01
【问题描述】:

对于以下数据整理任务的帮助,我将不胜感激。我有一个如下所示的数据框:

df <- data.frame(var1=c('a', 'b', 'c'), var2=c('d', 'e', 'f'), var3=c('h', 'j', 'k'))

我想用 var1 和 var2 固定次数复制每一行数据,比如说 3 次,但不是 var3。我想用 0 代替 var3 中的缺失值。

最后,我想要这个:

    df.expanded
  var1 var2 var3
1    a    d   h
2    a    d   0
3    a    d   0
4    b    e   j
5    b    e   0
6    b    e   0
7    c    f   k
8    c    f   0
9    c    f   0

【问题讨论】:

标签: r dataframe replication


【解决方案1】:

这确实与链接问题非常相似,主要区别在于“var3”中的预期值。牢记这一点,以下是我的处理方法:

## Expand
df.expanded <- df[rep(rownames(df), each = 3), ]

## Replace
df.expanded[["var3"]] <- as.character(df.expanded[["var3"]])
df.expanded[["var3"]][c(FALSE, TRUE, TRUE)] <- 0

## View
df.expanded
#     var1 var2 var3
# 1      a    d    h
# 1.1    a    d    0
# 1.2    a    d    0
# 2      b    e    j
# 2.1    b    e    0
# 2.2    b    e    0
# 3      c    f    k
# 3.1    c    f    0
# 3.2    c    f    0

这是使用“data.table”的一种可能方法:

library(data.table)
df.expanded <- as.data.table(df)[rep(sequence(nrow(df)), each = 3)][
  , var3 := replace(as.character(var3), .I %% 3 != 1, 0)][]

df.expanded
#    var1 var2 var3
# 1:    a    d    h
# 2:    a    d    0
# 3:    a    d    0
# 4:    b    e    j
# 5:    b    e    0
# 6:    b    e    0
# 7:    c    f    k
# 8:    c    f    0
# 9:    c    f    0

【讨论】:

  • 两者都适合我。谢谢!如果复制的 n 更大,使用 data.table 的解决方案可能会更方便。
  • 我更喜欢:rep(1:nrow(df),each=3),因为索引子集通常比行名子集更快。仍然是一个好方法 +1
【解决方案2】:

您可以尝试以下代码(为我工作):

df <- data.frame(var1=c('a', 'b', 'c'), var2=c('d', 'e', 'f'), var3=c('h', 'j', 'k'))

for(c in names(df)) df[,c] <- as.character(df[,c])

rep_time <- 3
res <- NULL

for(i in 1:length(df$var1)) {
  temp <- cbind(rep(df$var1[i],rep_time),rep(df$var2[i],rep_time),c(df$var3[i],rep(0,rep_time-1)))
  res <- rbind(res,temp)
}

res <- data.frame(res)

希望对你有所帮助

哥达维亚诺尼

【讨论】:

  • 这似乎不起作用。由于某种原因,所有 var3 值都变为 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
相关资源
最近更新 更多