Saya memiliki tibble dengan sangat banyak kolom. Saya perlu menambahkan baris ke lokasi tertentu (mis. sebelum baris 2). Bagaimana saya bisa melakukan ini tanpa mengetikkan nama kolom sebelum nilainya?

Misalnya. inilah yang harus saya lakukan (bayangkan lebih banyak kolom, 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)

Inilah yang saya harap dapat saya lakukan (mengembalikan kesalahan, karena nama kolom tidak ditentukan):

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

Saya dapat membuat tibble lain berdasarkan yang pertama dan menambahkannya ke yang lama menggunakan bind_rows, tetapi itu menambahkannya di akhir, yaitu saya tidak dapat menentukan lokasi sebelum baris 2:

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

(Tujuannya adalah untuk menginterpolasi antara dua nilai dalam tbl1.) Metode harus efisien, yaitu tidak dapat menyalin tbl1.

3
PaulG 3 Januari 2021, 23:57

3 jawaban

Jawaban Terbaik

Berikut adalah opsi dengan setNames

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

-keluaran

# A tibble: 3 x 2
#     V1    V2
#  <dbl> <dbl>
#1   1     3  
#2   1.5   3.5
#3   2     4  
2
akrun 3 Januari 2021, 20:59

Dengan tambahan purrr, Anda dapat melakukan:

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  
1
tmfmnk 3 Januari 2021, 21:15

Di basis R Anda dapat menambahkan baris di sembarang posisi dengan melakukan:

#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  
1
Ronak Shah 4 Januari 2021, 03:50