如何在不指定列名的情况下将行添加到特定位置(索引)的小标题? (右)

How to add rows to a tibble at a specific place (index) without specifying column names? (R)

我有很多专栏。我需要在特定位置向它添加一行(例如,在第 2 行之前)。如果不在值前键入列名,我该如何做到这一点?

例如这是我必须做的(想象更多列,V1、V2、V3,...):

library(tidyverse)
tbl1 = tibble(V1=c(1,2), V2=c(3,4))
tbl1 %>% add_row(V1=1.5, V2=2.5, .before = 2)

这是我希望我能做的(returns 错误,因为未指定列名):

library(tidyverse)
tbl1 = tibble(V1=c(1,2), V2=c(3,4))
tbl1 %>% add_row(c(1.5,3.5), .before = 2)

我可以根据第一个小标题创建另一个小标题,然后使用 bind_rows 将其附加到旧小标题,但将其添加到末尾,即我无法在第 2 行之前指定位置:

library(tidyverse)
tbl1 = tibble(V1=c(1,2), V2=c(3,4))
tbl2 = tbl1 %>% summarise_all(mean)
bind_rows(tbl1, tbl2)

(目标是在tbl1中的两个值之间进行插值。)方法必须是高效的,即不能复制tbl1。

这里有一个选项setNames

library(tibble)
tbl1 %>% 
     add_row(!!! setNames(list(1.5, 3.5), names(.)), .before = 2)

-输出

# A tibble: 3 x 2
#     V1    V2
#  <dbl> <dbl>
#1   1     3  
#2   1.5   3.5
#3   2     4  

加上 purrr,您可以:

map2_dfc(.x = c(1.5, 2.5),
         .y = names(tbl1),
         ~ tbl1 %>%
          select(.y) %>%
          add_row(!!.y := .x, .before = 2))

     V1    V2
  <dbl> <dbl>
1   1     3  
2   1.5   2.5
3   2     4  

在 base R 中,您可以通过以下操作在任意位置添加一行:

#get mean of all columns
vals <- colMeans(tbl1)
#Assign position where you want to add the new row
before <- 2
#Create row index for the new dataframe
inds <- sort(c(seq(nrow(tbl1)), before))
#Add last row at before position
inds[before] <- length(inds)
#combine the two output and arrange them based on `inds`
result <- rbind(tbl1, vals)[inds, ]
result

#   V1    V2
#  <dbl> <dbl>
#1   1     3  
#2   1.5   3.5
#3   2     4