将两列强制转换为 R 中的 1 列因子和 1 列对应值用于数据框

Posted

技术标签:

【中文标题】将两列强制转换为 R 中的 1 列因子和 1 列对应值用于数据框【英文标题】:Coercing two columns into 1 column of factors and 1 column of corresponding values in R for data frame 【发布时间】:2020-05-28 16:24:06 【问题描述】:

所以我正在尝试将“a”格式的数据框更改为“b”格式的数据框。

即数据帧“a”作为输入,数据帧“b”作为输出。

a <- data.frame(rowname = c("gene_a","gene_b","gene_c"),
            p_val = c(1, 1, 1),
            p_val_adj = c("1","1","1"),
            cluster = c(0, 1, 2),
            pct.1 = c(0.4, 0.4, 0.4),
            pct.2 = c(0.6, 0.6, 0.6))

b <- data.frame(rowname = c("gene_a", "gene_a", "gene_b", "gene_b", "gene_c", "gene_c"),
            colname = c("cluster_0_pct1", "cluster_0_pct2", "cluster_1_pct1", "cluster_1_pct2", 
                        "cluster_2_pct1","cluster_2_pct1"),
            values = c(0.4, 0.6, 0.4, 0.6, 0.4, 0.6))

为了用我自己的话来描述这个数据框编辑,我想合并集群列以及 pct.1 和 pct.2 列的名称,这样它就可以给我一个类似

的列
colname = c("cluster_0_pct1", "cluster_0_pct2", "cluster_1_pct1", "cluster_1_pct2", 
                    "cluster_2_pct1","cluster_2_pct1")

并使用 pct1 或 pct2 列中的相应值创建一个 value 列,具体取决于 colname,即 cluster_1_pct1 的值应为 0.4。

任何帮助将不胜感激。

我在尝试使用 dplyr 函数(如 rownames_to_column()、pivot_longer ... 等)时运气不佳。

【问题讨论】:

【参考方案1】:

我们可以将'pct.1'、'pct.2'在pivot_longerpaste'cluster'、'name'列中指定为'cols'重塑为'long'格式以创建'colname '

library(dplyr)
library(tidyr)
library(stringr)
a %>%
     pivot_longer(cols = pct.1:pct.2) %>%
     transmute(rowname, colname = str_c('cluster_', cluster, name), values = value)
#  rowname        colname values
#1  gene_a cluster_0pct.1    0.4
#2  gene_a cluster_0pct.2    0.6
#3  gene_b cluster_1pct.1    0.4
#4  gene_b cluster_1pct.2    0.6
#5  gene_c cluster_2pct.1    0.4
#6  gene_c cluster_2pct.2    0.6

gather

a %>%
    gather(key, values, pct.1:pct.2)  %>%
    transmute(rowname, colname = str_c('cluster_', cluster, key),values )

【讨论】:

以上是关于将两列强制转换为 R 中的 1 列因子和 1 列对应值用于数据框的主要内容,如果未能解决你的问题,请参考以下文章

Python:将两列数据框转换为一个插入列表[重复]

r 将两列一起绘制为单独的行ggplot

PySpark Dataframe 将两列转换为基于第三列值的元组新列

如何将两列转换为用于计数矢量化的序列?

如何将两列数组转换为具有出现次数的矩阵?

CSS:使用@media 查询将两列堆栈转换为单个堆栈