iç içe listeleri katılma ve sütun ekleyerek

oy
0

İki matrisleri içeren bir liste var:

a <- list(m1=matrix(1:9, nrow = 3, ncol = 3),
          m2=matrix(1:9, nrow = 3, ncol = 3))

İki matrisleri (satır bağlaması) bağlamak için ve satırları ayırt etmek istiyorum, matris adını içeren bir sütun eklemek istiyor. Ben kullanarak satırları bağlayabilir r bind:

b <- do.call(rbind, a) %>% as.data.frame

bu verimler

  V1 V2 V3
1  1  4  7
2  2  5  8
3  3  6  9
4  1  4  7
5  2  5  8
6  3  6  9

Ama nasıl adlarını içeren bir sütun eklerim? Yapabileceğim b$id <- c(m1,m1,m1,m2,m2,m2)ancak bundan daha kolay bir yolu olmalı (?)

Oluştur 08/11/2018 saat 11:28
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

İşte dplyr / purrr bunu yapmak için nasıl

a %>% purrr::map(as.data.frame) %>% dplyr::bind_rows(.id = "origin")
  origin V1 V2 V3
1     m1  1  4  7
2     m1  2  5  8
3     m1  3  6  9
4     m2  1  4  7
5     m2  2  5  8
6     m2  3  6  9

Bu onları satır bağlama önce veri çerçeveleri matrisleri dönüştürür.

Sen kullanabilirsiniz bind_rowsmatrislerin bir listede. Ama beklediğiniz döndürmez.

a %>% bind_rows(.id = "origin")
# A tibble: 9 x 3
  origin    m1    m2
  <chr>  <int> <int>
1 1          1     1
2 1          2     2
3 1          3     3
4 1          4     4
5 1          5     5
6 1          6     6
7 1          7     7
8 1          8     8
9 1          9     9

Bu, olur m1ve m2aynı uzunlukta (bunlar matrisler olduğundan) olan vektörleri ve bind_rowstek bir veri çerçevesi olarak sabit uzunlukta vektörlerinin bir listesini görmektedir. Yani ikinci çağrı eşdeğerdir

bind_rows(data.frame(m1 = as.vector(m1), m2 = as.vector(m2)), .id = "origin")

Yani, onları bir araya bağlamak önce data.frames için matrisler dönüştürmek emin olun.

Cevap 08/11/2018 saat 11:36
kaynak kullanıcı

oy
1

Yapabilirsin:

b <- do.call(rbind.data.frame, a)

#     V1 V2 V3
#m1.1  1  4  7
#m1.2  2  5  8
#m1.3  3  6  9
#m2.1  1  4  7
#m2.2  2  5  8
#m2.3  3  6  9

ya bununla mutlu değilse,

b    <- do.call(rbind.data.frame, a)
b$id <- sub("[.].+", "", rownames(b))

#     V1 V2 V3 id
#m1.1  1  4  7 m1
#m1.2  2  5  8 m1
#m1.3  3  6  9 m1
#m2.1  1  4  7 m2
#m2.2  2  5  8 m2
#m2.3  3  6  9 m2
Cevap 08/11/2018 saat 11:37
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more