我有一个具有唯一行名和唯一列名的数据框。我想将行转换为列,将列转换为行。
例如,此代码:
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
答案 0 :(得分:24)
只需使用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
返回一个矩阵。正如Mark建议用as.data.frame
包装它时会返回数据帧而不是矩阵。谢谢!
答案 1 :(得分: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
选项默认情况下将所有内容转换为字符
有混合列类型。