使用R将行转换为列,将列转换为行

Posted

技术标签:

【中文标题】使用R将行转换为列,将列转换为行【英文标题】:Converting rows into columns and columns into rows using R 【发布时间】:2015-04-25 04:51:17 【问题描述】:

我有一个具有唯一行名和唯一列名的数据框。我想将行转换为列,将列转换为行。

例如这段代码:

starting_df <- data.frame(row.names= c(LETTERS[1:4]),
                          a = c(1:4),
                          b = seq(0.02,0.08,by=0.02),
                          c = c("Aaaa","Bbbb","Cccc","Dddd")
                )

结果如下:

> starting_df
  a    b    c
A 1 0.02 Aaaa
B 2 0.04 Bbbb
C 3 0.06 Cccc
D 4 0.08 Dddd

我想将它转换成另一个包含完全相同数据的数据框,除了以前的行现在是列,反之亦然:

> final_df
     A    B    C    D
a    1    2    3    4
b 0.02 0.04 0.06 0.08
c Aaaa Bbbb Cccc Dddd

【问题讨论】:

我可以用另一种语言来做这件事,但我确信在 R 中有一种快速的方法。当我意识到答案是什么时,我感到非常愚蠢,但认为这对任何试图弄清楚它的人都有用。顺便说一句,我在 *** 中搜索了带有 [r] 标记的许多变体:将行转换为列,反之亦然;将列转换为行,将行转换为列;旋转数据框;交换行和列; 【参考方案1】:

只需使用基本转置函数t,用as.data.frame包裹:

final_df <- as.data.frame(t(starting_df))
final_df
     A    B    C    D
a    1    2    3    4
b 0.02 0.04 0.06 0.08
c Aaaa Bbbb Cccc Dddd

以上更新。正如 docendo discimus 指出的那样,t 返回一个矩阵。正如马克建议用as.data.frame 包装它返回一个数据框而不是一个矩阵。谢谢!

【讨论】:

通过转置 data.frame,您已经“秘密”将其转换为类矩阵:class(final_df) # [1] "matrix" 在它周围包裹一个 as.data.frame() 以确保它是一个 data.frame @Mark,如果你有不同类的列,转换为矩阵可能会有一些副作用,因为 R 中的矩阵只能有相同类的列。 @docendodiscimus 好点 - 我通常会等待那个问题咬我但是。但是,在这种情况下,您的所有行都必须是同一个类才能使转置有意义。【参考方案2】:

这里有一个 tidyverse 选项,它可能会根据数据起作用,并对其使用有一些警告:

library(tidyverse)

starting_df %>% 
  rownames_to_column() %>% 
  gather(variable, value, -rowname) %>% 
  spread(rowname, value)

rownames_to_column() 如果原始数据帧具有有意义的行名是必需的,否则新转置数据帧中的新列名将是与原始行号对应的整数。如果没有有意义的行名,您可以跳过rownames_to_column() 并将rowname 替换为数据框中第一列的名称,假设这些值是唯一且有意义的。使用tidyr::smiths 示例数据将是:

smiths %>% 
    gather(variable, value, -subject) %>% 
    spread(subject, value)

将示例 starting_dftidyverse 方法一起使用将引发有关删除属性的警告消息。这与将具有不同属性类型的列转换为单个字符列有关。 smiths 数据不会发出警告,因为除 subject 之外的所有列都是双精度列。

使用as.data.frame(t()) 的较早答案会将所有内容转换为因子 如果有混合列类型,除非添加了stringsAsFactors = FALSE, 而tidyverse 选项默认将所有内容转换为字符,如果 有混合列类型。

【讨论】:

以上是关于使用R将行转换为列,将列转换为行的主要内容,如果未能解决你的问题,请参考以下文章

选择 MYSQL 行,但将行选择为列,将列选择为行

SQL 将列转换为行

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

使用 Pandas 将列转换为行

使用枢轴将行转换为列

将行转换为列