如何将列数据变成列名?
How to turn column data into column names?
我得到了一个光谱学参考数据库,它与我正在使用的示例数据集非常不同。在我的数据中,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
这些过于简单化了,但它们说明了问题 - 如果我需要提供实际数据,请告诉我。我需要 transpose/sort 单元格中的值,同时替换二进制文件中的原始值(同样,我不需要将肽列名称保留在参考数据库中)。我真的希望有一个简单的 dplyr 或 tidyr 技巧 - 我想一个传播函数可以工作,但我不知道如何为多列做这件事,也不知道如何保留原始数据。或者,我可以手动将所有数据附加为长格式,然后 melt/cast 将其转换为更宽的格式?
希望这就是您要找的:
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()
的真正有用的参数简化上述语法,如
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
在 data.table
中你可以使用 melt
和 dcast
:
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
我得到了一个光谱学参考数据库,它与我正在使用的示例数据集非常不同。在我的数据中,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
这些过于简单化了,但它们说明了问题 - 如果我需要提供实际数据,请告诉我。我需要 transpose/sort 单元格中的值,同时替换二进制文件中的原始值(同样,我不需要将肽列名称保留在参考数据库中)。我真的希望有一个简单的 dplyr 或 tidyr 技巧 - 我想一个传播函数可以工作,但我不知道如何为多列做这件事,也不知道如何保留原始数据。或者,我可以手动将所有数据附加为长格式,然后 melt/cast 将其转换为更宽的格式?
希望这就是您要找的:
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()
的真正有用的参数简化上述语法,如
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
在 data.table
中你可以使用 melt
和 dcast
:
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