使用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_df
与 tidyverse
方法一起使用将引发有关删除属性的警告消息。这与将具有不同属性类型的列转换为单个字符列有关。 smiths
数据不会发出警告,因为除 subject
之外的所有列都是双精度列。
使用as.data.frame(t())
的较早答案会将所有内容转换为因子
如果有混合列类型,除非添加了stringsAsFactors = FALSE
,
而tidyverse
选项默认将所有内容转换为字符,如果
有混合列类型。
【讨论】:
以上是关于使用R将行转换为列,将列转换为行的主要内容,如果未能解决你的问题,请参考以下文章