将行更改为 R 中的列

Changing lines to column in R

我有一个这样的数据框:

Month Site1 Site2 Site3
Jan    5     6     8
Feb    2     3     4
Mar    8     2     2

我想改成

Site Jan Feb Mar
Site1 5   2   8
Site2 6   3   2
Site3 8   4   2

我该怎么做?

我们可以使用 recastlibrary(reshape2)

library(reshape2)
dfN <- recast(df1, id.var='Month', variable~Month, value.var='value')

如果我们需要对列进行排序

cbind(Site=dfN[,1], dfN[-1][order(match(names(dfN)[-1], month.abb))])
#    Site Jan Feb Mar
#1 Site1   5   2   8
#2 Site2   6   3   2
#3 Site3   8   4   2

更快的选择是 melt/dcast 来自 data.table

library(data.table)
dcast(melt(setDT(df1), id.var='Month', 
    variable.name='Site')[, Month:= factor(Month,
    levels=month.abb)], Site~Month, value.var='value')

base R

`row.names<-`(cbind(Site= colnames(df1)[-1], 
    setNames(as.data.frame(t(df1[-1])), df1[,1])), NULL)

一个简单的转置是否也能解决您的问题?

> bla <- read.table("test.df", header=T, row.names=1, sep='\t')
> bla
    Site1 Site2 Site3
Jan     5     6     8
Feb     2     3     4
Mar     8     2     2
> t(bla)
      Jan Feb Mar
Site1   5   2   8
Site2   6   3   2
Site3   8   4   2

这可能是更简单直接的解决方案,而不是使用重塑。

基本的 R 替代方案类似于:

reshape(cbind(mydf[1], stack(mydf[-1])), idvar = "ind", 
        timevar = "Month", direction = "wide")
##     ind values.Jan values.Feb values.Mar
## 1 Site1          5          2          8
## 4 Site2          6          3          2
## 7 Site3          8          4          2

剩下的就是清理列名....