【问题标题】:How to turn column data into column names?如何将列数据转换为列名?
【发布时间】:2021-07-17 05:41:09
【问题描述】:

我获得了一个光谱参考数据库,该数据库与我使用的样本数据集非常不同。在我的数据中,0 或 1 表示是否存在峰值,而在参考数据库中,峰值位置被列为行值,并根据肽数据分组为列(我不需要)。

我的数据集如下所示:

Sample   1110   1111   1112
1         1        0      0
2         1        0      1
3         0        1      1
4         1        1      1

虽然参考数据库看起来像这样令人讨厌(注意每列有多个值):

Species     peptide1   peptide2    peptide3
cow           1110        1112         NA
sheep         1111        1112         NA
goat           NA         1113        1114

所需的输出看起来类似于我的数据集:

Species   1110    1111    1112    1113    1114
cow         1        0      1        0      0
sheep       0        1      1        0      0
goat        0        0      0        1      1

这些过于简单,但它们说明了问题 - 如果我需要提供实际数据,请告诉我。我需要对单元格中的值进行转置/排序,同时替换二进制文件中的原始值(同样,我不需要将肽列名称保留在参考数据库中)。我真的希望有一个简单的 dplyr 或 tidyr 技巧 - 我想传播函数可以工作,但我不知道如何为多列执行此操作,也不知道如何保留原始数据。或者,我可以手动将所有数据附加为长格式,然后将其融化/转换为更宽的格式?

【问题讨论】:

  • @RonakShah 我已经用它更新了问题!

标签: r dataframe dplyr tidyr reshape2


【解决方案1】:

我希望这是您正在寻找的:

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(!Species) %>%
  mutate(val = 1) %>%
  select(-name) %>%
  drop_na() %>%
  arrange(value) %>%
  pivot_wider(names_from = value, values_from = val) %>%
  mutate(across(!Species, ~ replace_na(., 0)))

# A tibble: 3 x 6
  Species `1110` `1111` `1112` `1113` `1114`
  <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 cow          1      0      1      0      0
2 sheep        0      1      1      0      0
3 goat         0      0      0      1      1

数据

df <- tribble(
  ~Species,     ~peptide1,   ~peptide2,    ~peptide3,
  "cow",           1110,        1112,         NA,
  "sheep",         1111,        1112,         NA,
  "goat",           NA,         1113,        1114
)

通过使用pivot_longer() & pivot_wider() as 的真正有用的参数来简化上述语法

df %>% 
  pivot_longer(!Species, values_drop_na = TRUE) %>% 
  pivot_wider(id_cols = Species, names_from = value, names_sort = TRUE, values_fill = 0, values_fn = length)

# A tibble: 3 x 6
  Species `1110` `1111` `1112` `1113` `1114`
  <chr>    <int>  <int>  <int>  <int>  <int>
1 cow          1      0      1      0      0
2 sheep        0      1      1      0      0
3 goat         0      0      0      1      1

【讨论】:

  • 这个可以简化为df %&gt;% pivot_longer(!Species, values_drop_na = T) %&gt;% pivot_wider(id_cols = Species, names_from = value, names_sort = T, values_fill = 0, values_fn = length)
  • 哦,这很有趣。我从 David Robinson 的一个 tidytuesday 会议中学到了我用于这个问题的解决方案。但你的也很有帮助。我猜pivot_longerpivot_wider 中的论点比我想象的要有用得多。
  • 是的。这些对于删除代码的冗余部分非常有用。请注意values_from arg 未用于pivot_wider
  • @akrun 你是绝对正确的。我刚刚编辑过。
【解决方案2】:

data.table 中,您可以使用meltdcast

library(data.table)
dcast(melt(setDT(df), 1, na.rm = TRUE), Species~value, fun.aggregate = length)

#    Species 1110 1111 1112 1113 1114
#1:     cow    1    0    1    0    0
#2:    goat    0    0    0    1    1
#3:   sheep    0    1    1    0    0

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多