【问题标题】:Set row names to multiple matrices in R将行名称设置为 R 中的多个矩阵
【发布时间】:2020-07-27 05:02:47
【问题描述】:

我有一个包含两个数据框的列表。基于此,我创建了一个带有数字变量的矩阵。在下一步中,我尝试根据原始列表的一列将行名设置为矩阵。但是,这不起作用。将行名称设置为原始列表确实有效。有谁知道问题出在哪里?

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

reprex package (v0.3.0) 于 2020-04-14 创建

【问题讨论】:

    标签: r matrix purrr rowname


    【解决方案1】:

    更好的选择是使用rownames.forceas.matrix 参数作为data.frame 输入:

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

    【讨论】:

      【解决方案2】:

      你也可以这样做。

      
      # 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
      
      

      【讨论】:

        【解决方案3】:

        一个选项可能是:

        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
        

        【讨论】:

          猜你喜欢
          • 2011-08-08
          • 2014-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-11
          • 1970-01-01
          • 2020-08-09
          相关资源
          最近更新 更多