将行更改为 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
我该怎么做?
我们可以使用 recast
从 library(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
剩下的就是清理列名....
我有一个这样的数据框:
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
我该怎么做?
我们可以使用 recast
从 library(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
剩下的就是清理列名....