【问题标题】:Column titles contain sample info how do i split them into two columns in R列标题包含示例信息我如何将它们分成 R 中的两列
【发布时间】:2021-05-24 19:05:33
【问题描述】:

我正在尝试将一些数据帧清理为更有用的格式,我正在运行 R studio 1.3.1093 和 R 3.5.3。

我的数据框如下所示:

Peptide 5C_T6m 5C_T12m
PEP 0.5 1.1
TIDE 0.6 1.2

我正在尝试将其转换为:

Peptide Temp Timepoint abundance
PEP 5 6 0.5
TIDE 5 6 0.6
PEP 5 12 1.1
TIDE 5 12 1.2

我无法想象如何在两者之间移动。逐步进行。
我是 R 新手,已经使用 TidyVerse 对数据进行了一些重塑,但在我看来,这需要多个步骤才能到达那里,而且我很难将各个步骤可视化。

对于我需要采取的步骤或一些代码建议的任何帮助都会很棒。

谢谢!

【问题讨论】:

    标签: r tidyverse tidyr data-cleaning


    【解决方案1】:

    函数pivot_longer在这种情况下非常有用

    df %>%  pivot_longer(cols=!Peptide, 
                     names_to = c("Temp", "Timepoint"),
                     names_pattern = "(.*)C_T(.*)m",
                     values_to = "abundance")
    

    【讨论】:

    • 我投了赞成票,因为这个答案提供了一个很好的技术解决方案。但如果有解释,尤其是names_pattern 正在做什么,这将是一个更好的答案。
    • 感谢您的回答,效果非常好。我将如何扩展 Pivot_longer(Cols=!Peptide, 参数以包含更多列?说一个名为“Molecule”的附加列。例如,我尝试过 Pivot_longer(Cols(c(=!Peptide, Molecule),但没有奏效.
    • 你必须看到dplyr.tidyverse.org/reference/dplyr_tidy_select.html,你可以为'cols'使用不同的参数。在该页面中,您可以找到解释。
    【解决方案2】:

    这是一个可能的解决方案,我知道你想要的。

    library(tidyverse)
     
     df <- data.frame(Peptide = c("PEP","TIDE"), C5_T6m = c(0.5,0.6), C5_T12m = c(1.1,1.2)) 
     
     dt <- df %>% 
    gather( Timepoint, abundance, 2:3) %>% 
    mutate(Temp = str_extract(Timepoint,"5")) %>% 
    mutate(Timepoint =  str_extract(Timepoint,"6|12")) %>% 
    select(Peptide,Temp,Timepoint,abundance)
    

    结果

    >  dt
      Peptide Temp Timepoint abundance
    1     PEP    5         6       0.5
    2    TIDE    5         6       0.6
    3     PEP    5        12       1.1
    4    TIDE    5        12       1.2
    

    【讨论】:

    • 感谢您的回答!它工作得非常好,就像上面的答案一样——我可以轻松地对其进行编辑,以包含更多需要收集的时间点和时间。您可以更改聚集(时间点、丰度、2:3)以合并所有可能的列,使其更加灵活。我使用了收集(时间点,丰富,2:ncol(df)),这似乎很好用!感谢您的帮助
    • 我发现的一个问题是,例如,当 Temp 和 Timepoint 具有相同的字符时。如果它的温度为 5 和 60,时间点为 6 和 12。则 Timepoint =12 的数据列为 Timpoint =6。不知道如何解决这个问题...有什么想法吗?
    • 我不太明白你在问什么。展示一个数据框以查看您需要的示例。 df
    • 对不起,我的意思是如果数据框看起来像这样:df % mutate(Timepoint = str_extract(Timepoint,"6|12")) %>% select(Peptide,Temp,Timepoint,abundance) 输出表没有添加Timepoint = str_extract(Timepoint "6 |12")) 正确。我认为这是因为 str_extract 命令。我不确定是否有替代方案
    • 在您现在传递的代码中,您已经将我的代码的gather函数替换为collec。如果你再用gather就可以了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多