【问题标题】:Add column but duplicate all other row values in dataframe in R [duplicate]添加列但在R中的数据框中复制所有其他行值[重复]
【发布时间】:2020-07-29 04:04:37
【问题描述】:

我想通过重复一行 24 次来扩展我的数据框,同时为“小时”添加一个额外的列。这是我的数据示例:

set.seed(1)
mydata <- data.frame(Tmin = sample(0:3), Tmax = sample(4:7), Day = rep(1:4))

我想扩展此表,使每一行都以相同的 Tmin、Tmax 和 Day 重复 24 次,并增加一列 mydata$hour,其中每天重复数字 1:24。每行的所有其他值(Tmin、Tmax、Day)保持不变。谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以重复每行索引 24 次,然后使用回收技术从 1 到 24 分配新的 hour 列。

    newdata <- mydata[rep(seq_len(nrow(mydata)), each = 24),]
    newdata$hour <- 1:24
    

    几个tidyverse 选项:

    library(dplyr)
    mydata %>% tidyr::uncount(24) %>% group_by(Day) %>% mutate(hour = 1:24)
    

    mydata %>% group_by(Day) %>% slice(rep(row_number(), 24)) %>% mutate(hour = 1:24)
    

    【讨论】:

    • 谢谢 - 我尝试了您的第一个选项,但收到此错误:Error: Assigned data `value` must be compatible with existing data. x Existing data has 6912 rows. x Assigned data has 24 rows. i Only vectors of size 1 are recycled.
    • 您的第二个选项有效 - 谢谢!!
    • @NorthLattitude 看起来您的实际数据是 tibble 而不是数据框。如果您执行newdata &lt;- data.frame(newdata) 并再次尝试它应该可以工作。
    【解决方案2】:

    使用lapplydplyr::mutate 的另一种选择。

    library(dplyr)
        set.seed(1)
        mydata <- data.frame(Tmin = sample(0:3), Tmax = sample(4:7), Day = rep(1:4))
        newdata <- as.data.frame(lapply(mydata, rep, 24))
        newdata %>% 
            mutate(hour = rep(c(1:24), times = 4))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 2013-04-25
      • 2020-03-15
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      相关资源
      最近更新 更多