将值与 R 中的行名匹配

Posted

技术标签:

【中文标题】将值与 R 中的行名匹配【英文标题】:match values to the rowname in R 【发布时间】:2022-01-23 00:11:08 【问题描述】:

我的数据框看起来像这样

path:hsa00010   cpd:C00022
path:hsa00010   cpd:C00024
path:hsa00010   cpd:C00031
path:hsa00010   cpd:C00033
path:hsa00010   cpd:C00036
path:hsa00010   cpd:C00068
path:hsa00010   cpd:C00074
path:hsa00010   cpd:C00084
path:hsa00010   cpd:C00103
path:hsa00010   cpd:C00111
path:hsa00020   cpd:C00022
path:hsa00020   cpd:C00024
path:hsa00020   cpd:C00031
path:hsa00020   cpd:C00033
path:hsa00020   cpd:C00036
path:hsa00020   cpd:C00068
path:hsa00020   cpd:C00074
path:hsa00020   cpd:C00084
path:hsa00020   cpd:C00103
path:hsa00020   cpd:C00111

我想使用第二列作为行名并获得这样的数据框

cpd:C00022 path:hsa00010 path:hsa00020
cpd:C00024 path:hsa00010 path:hsa00020
...

有人可以提供任何想法吗?谢谢!

【问题讨论】:

你试过rownames(mydata) <- mydata[,2]吗?如果这不起作用,请提供一个可重现的示例(实际代码和数据) 我现在才看到您要分配重复的行名(例如“cpd:C00022”)。这在 R data.frames 中是不可能的。如果您想对“cpd:C00022”和“cpd:00024”的数据进行子集化,您可以尝试mydata[mydata[,2] %in% c("cpd:C00022", "cpd:C00024"),],或使用例如mydata[grep("C0002\d", mydata[,2]),]. @scrameri 谢谢。我现在可以有子集。但是如何将其从列转换为行? 如果您开始使用dplyr 动词,其中许多会忽略或有意删除行名。虽然基本 R 函数倾向于处理行名称(而不是故意删除它们),但它们也可以在不真正通知您的情况下更改它们,通常以确保它们是唯一的前提(例如,添加 @ 987654328@ 或类似名称以唯一化名称)。因此,通常建议将基于行的索引/***索引***作为列,而不是作为行名,因此 (1) 函数不会默默地更改它们,并且 (2) 您可以有任意数量的“索引”(列)。 @RRRRRRRR 很难理解你到底想要转换什么。请使用真实的代码和数据(不是复制粘贴的数据)制作一个最小的可重现示例。 3-4 行数据应该足以向我们展示您想在更大的 data.frame 上做什么,以及您尝试过哪些没有奏效。见***.com/questions/5963269/… 【参考方案1】:

你想要这样的东西吗,使用dplyr::group_by()dplyr::summarize()?一旦你有了这个,你当然可以将cpd... 列转换为行名,如果你真的需要它作为行名。

library(dplyr)
library(tidyr)

df <- tibble::tribble(
  ~x,              ~y,
  "path:hsa00010", "cpd:C00022",
  "path:hsa00010", "cpd:C00024",
  "path:hsa00010", "cpd:C00031",
  "path:hsa00010", "cpd:C00033",
  "path:hsa00010", "cpd:C00036",
  "path:hsa00010", "cpd:C00068",
  "path:hsa00010", "cpd:C00074",
  "path:hsa00010", "cpd:C00084",
  "path:hsa00010", "cpd:C00103",
  "path:hsa00010", "cpd:C00111",
  "path:hsa00020", "cpd:C00022",
  "path:hsa00020", "cpd:C00024",
  "path:hsa00020", "cpd:C00031",
  "path:hsa00020", "cpd:C00033",
  "path:hsa00020", "cpd:C00036",
  "path:hsa00020", "cpd:C00068",
  "path:hsa00020", "cpd:C00074",
  "path:hsa00020", "cpd:C00084",
  "path:hsa00020", "cpd:C00103",
  "path:hsa00020", "cpd:C00111"
)

df %>% 
  group_by(y) %>% 
  summarise(x = list(x)) %>% 
  ungroup() %>% 
  unnest_wider(x, names_sep = "_")
#> # A tibble: 10 x 3
#>    y          x_1           x_2          
#>    <chr>      <chr>         <chr>        
#>  1 cpd:C00022 path:hsa00010 path:hsa00020
#>  2 cpd:C00024 path:hsa00010 path:hsa00020
#>  3 cpd:C00031 path:hsa00010 path:hsa00020
#>  4 cpd:C00033 path:hsa00010 path:hsa00020
#>  5 cpd:C00036 path:hsa00010 path:hsa00020
#>  6 cpd:C00068 path:hsa00010 path:hsa00020
#>  7 cpd:C00074 path:hsa00010 path:hsa00020
#>  8 cpd:C00084 path:hsa00010 path:hsa00020
#>  9 cpd:C00103 path:hsa00010 path:hsa00020
#> 10 cpd:C00111 path:hsa00010 path:hsa00020

由reprex package (v2.0.0) 于 2021 年 12 月 21 日创建

【讨论】:

【参考方案2】:

我们可能正在这里寻找pivot_wider

library(tidyr)
library(dplyr)
library(stringr)

df %>% pivot_wider(values_from = path,
                   values_fn = \(x) str_remove_all(x, 'path:'),
                   names_from = path,
                   names_glue = 'path_1:length(unique(path))'
                   )%>%
    mutate(cpd = str_remove_all(cpd, "^cpd:"))

# A tibble: 10 × 3
   cpd    path_1   path_2  
   <chr>  <chr>    <chr>   
 1 C00022 hsa00010 hsa00020
 2 C00024 hsa00010 hsa00020
 3 C00031 hsa00010 hsa00020
 4 C00033 hsa00010 hsa00020
 5 C00036 hsa00010 hsa00020
 6 C00068 hsa00010 hsa00020
 7 C00074 hsa00010 hsa00020
 8 C00084 hsa00010 hsa00020
 9 C00103 hsa00010 hsa00020
10 C00111 hsa00010 hsa00020

【讨论】:

以上是关于将值与 R 中的行名匹配的主要内容,如果未能解决你的问题,请参考以下文章

在将其组合到R中的一个数据帧时,在不同的数据帧中保留重复的行名[重复]

R中的列名和行名匹配

如果值与在 r 中有条件删除的值匹配,则删除行

在 MySql 中,有没有办法将值与列中的数字进行比较?

R语言中怎么把第一列的数据作为行名

将列中的值转换为现有数据框中的行名