【问题标题】:Creating data frame with repeat rows创建具有重复行的数据框
【发布时间】:2021-07-02 06:57:06
【问题描述】:

我想创建一个包含重复行的数据框。

这是我的原始数据集:

> mtcars_columns_a
  variables_interest data_set data_set_and_variables_interest      mean
1                mpg   mtcars                      mtcars$mpg  20.09062
2               disp   mtcars                     mtcars$disp 230.72188
3                 hp   mtcars                       mtcars$hp 146.68750

这是我想要的数据集

> mtcars_columns_b
  variables_interest data_set data_set_and_variables_interest      mean
1                mpg   mtcars                      mtcars$mpg  20.09062
2                mpg   mtcars                      mtcars$mpg  20.09062
3               disp   mtcars                     mtcars$disp 230.72188
4               disp   mtcars                     mtcars$disp 230.72188
5                 hp   mtcars                       mtcars$hp 146.68750
6                 hp   mtcars                       mtcars$hp 146.68750

我知道如何手动完成这项工作,但这既费时又死板。有没有更快速、更自动化、更灵活的方法?



这是我用来创建数据集的代码:

# mtcars data

## displays data
mtcars

## 3 row data set

### lists columns of interest
# ---- NOTE: REQUIRES MANUAL INPUT
# ---- NOTE: lists variables of interest
mtcars_columns_a <- 
  data.frame(
    c(
      "mpg",
      "disp",
      "hp"
    )
  )
# ---- NOTE: REQUIRES MANUAL INPUT
# ---- NOTE: adds colnames
names(mtcars_columns_a)[names(mtcars_columns_a) == 'c..mpg....disp....hp..'] <- 'variables_interest'

### adds data set info
mtcars_columns_a$data_set <- 
  c("mtcars")

### creates data_set_and_variables_interest column
mtcars_columns_a$data_set_and_variables_interest <- 
  paste(mtcars_columns_a$data_set,mtcars_columns_a$variables_interest,sep = "$")

### creates mean column
mtcars_columns_a$mean <-
  c(
    mean(mtcars$mpg),
    mean(mtcars$disp),
    mean(mtcars$hp)
  )

## 6 row data set., the long way

### lists columns of interest
# ---- NOTE: REQUIRES MANUAL INPUT
# ---- NOTE: lists variables of interest
mtcars_columns_b <- 
  data.frame(
    c(
      "mpg",
      "mpg",
      "disp",
      "disp",
      "hp",
      "hp"
    )
  )
# ---- NOTE: REQUIRES MANUAL INPUT
# ---- NOTE: adds colnames
names(mtcars_columns_b)[names(mtcars_columns_b) == 'c..mpg....mpg....disp....disp....hp....hp..'] <- 'variables_interest'

### adds data set info
mtcars_columns_b$data_set <- 
  c("mtcars")

### creates data_set_and_variables_interest column
mtcars_columns_b$data_set_and_variables_interest <- 
  paste(mtcars_columns_b$data_set,mtcars_columns_b$variables_interest,sep = "$")

### creates mean column
mtcars_columns_b$mean <-
  c(
    mean(mtcars$mpg),
    mean(mtcars$mpg),
    mean(mtcars$disp),
    mean(mtcars$disp),
    mean(mtcars$hp),
    mean(mtcars$hp)
  )

【问题讨论】:

  • 从你想要的输出看来你可以做 rbind(mtcars_columns_a, mtcars_columns_a)?

标签: r iteration repeat


【解决方案1】:

您可以尝试rep,如下所示

mtcars_columns_a[rep(seq(nrow(mtcars_columns_a)), each = 2),]

【讨论】:

    【解决方案2】:

    另一个选项是uncount

    library(dplyr)
    library(tidyr)
    mtcars_columns_a %>%
       uncount(2)
    

    【讨论】:

      【解决方案3】:

      根据您的预期输出,这是您所追求的吗?

      使用select 函数选择所需变量,然后使用group_by 变量后的summarise 函数计算平均值。

      使用 mutate 执行数据的复制和添加其他变量(不确定是否有必要)。

      您可以使用dplyr::rename 函数编辑变量名称。

      library(dplyr)
      library(tidyr)
      
      
      df <- 
        mtcars %>% 
        select(mpg, disp, hp) %>% 
        pivot_longer(everything()) %>% 
        group_by(name) %>% 
        summarise(mean = mean(value))
      
      df1 <- 
        bind_rows(df, df) %>% 
        arrange(name) %>% 
        mutate(dataset = "mtcars",
               variable = paste(dataset, name, sep = "$"))
      
      df1
      #> # A tibble: 6 x 4
      #>   name   mean dataset variable   
      #>   <chr> <dbl> <chr>   <chr>      
      #> 1 disp  231.  mtcars  mtcars$disp
      #> 2 disp  231.  mtcars  mtcars$disp
      #> 3 hp    147.  mtcars  mtcars$hp  
      #> 4 hp    147.  mtcars  mtcars$hp  
      #> 5 mpg    20.1 mtcars  mtcars$mpg 
      #> 6 mpg    20.1 mtcars  mtcars$mpg
      

      由reprex package (v1.0.0) 于 2021-04-06 创建

      【讨论】:

        【解决方案4】:

        data.frame 对象中的记录顺序通常没有意义,因此您可以这样做:

        rbind(mtcars_columns_a, mtcars_columns_a)
        

        如果你需要它按照你显示的顺序,这也很简单:

        mtcars_columns_b <- rbind(mtcars_columns_a, mtcars_columns_a)
        mtcars_columns_b[order(mtcars_columns_b, mtcars_columns_b$name),]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-29
          • 2021-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多