Установить имена строк для нескольких матриц в R - PullRequest
3 голосов
/ 14 апреля 2020

У меня есть список, состоящий из двух кадров данных. Исходя из этого, я создал матрицу с числовыми переменными c. На следующем шаге я пытаюсь установить имена строк в матрице на основе столбца исходного списка. Однако это не работает. Установка имен строк в исходный список работает. Кто-нибудь знает, где проблема?

install.packages("purrr")
library(purrr)

# Data
data1 <- data.frame(new_id = c("y", "z"), met1 = c(20, 25),  met2 = c(20, 25))
data2 <- data.frame(new_id = c("b", "c"), met1 = c(5, 15), met2 =c(22, 24))

my_list <- list(data1, data2) # List of two dataframes

my_list
#> [[1]]
#>   new_id met1 met2
#> 1      y   20   20
#> 2      z   25   25
#> 
#> [[2]]
#>   new_id met1 met2
#> 1      b    5   22
#> 2      c   15   24

# Set row names: new_id
my_list1 <- my_list %>% 
    purrr::map(~data.frame(.x, row.names = .x$new_id)) # Works

my_list1
#> [[1]]
#>   new_id met1 met2
#> y      y   20   20
#> z      z   25   25
#> 
#> [[2]]
#>   new_id met1 met2
#> b      b    5   22
#> c      c   15   24

# Convert "my_list" into matrix and select numeric vars met1 and met2
matrix <- my_list %>% 
   purrr::map(~dplyr::select(.x, met1, met2)) %>% 
   purrr::map(as.matrix)

# Convert "num_slct" to matrix and set row.names
  matrix %>% 
  purrr::map(~.x, row.names = my_list$new_id) # set row.names does not work
#> [[1]]
#>      met1 met2
#> [1,]   20   20
#> [2,]   25   25
#> 
#> [[2]]
#>      met1 met2
#> [1,]    5   22
#> [2,]   15   24

Создано в 2020-04-14 с помощью пакета Представить (v0.3.0)

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

Вы также можете просто сделать это.


# Data
data1 <- data.frame(new_id = c("y", "z"), met1 = c(20, 25),  met2 = c(20, 25))
data2 <- data.frame(new_id = c("b", "c"), met1 = c(5, 15), met2 =c(22, 24))

my_list <- list(data1, data2)

my_list %>% 
  purrr::map(~as.matrix(data.frame(.x, row.names = .x$new_id) %>% select(-new_id)))  

[[1]]
  met1 met2
y   20   20
z   25   25

[[2]]
  met1 met2
b    5   22
c   15   24

1 голос
/ 14 апреля 2020

Один из вариантов может быть:

map(.x = my_list, ~ as.matrix(.x[-1]) %>%
     `rownames<-`(.x$new_id))

[[1]]
  met1 met2
y   20   20
z   25   25

[[2]]
  met1 met2
b    5   22
c   15   24
0 голосов
/ 14 апреля 2020

Лучшим вариантом является использование аргумента rownames.force для as.matrix для входных данных data.frame:

my_list %>% 
    purrr::map(~dplyr::select(.x, met1, met2)) %>% map(as.matrix,rownames.force=TRUE)
...