如何在Transpose dataframe R时保留原始类/格式

时间:2015-10-07 08:25:05

标签: r

我的数据框NumOrder1包含以下5列:

     ChannelN Order1 Order2 Order3 Order4 Order5
1     EXS     256     242    251     270    274
2     ISO     25      29     26      43    26
3     ISS     89      74     111     85    79

现在我使用转置NumbOrder2<-data.frame(t(NumOrder1))来转换矩阵的列和行。现在我有了

            X1    X2   X3   
ChannelN    EXS   ISO  ISS 
Order1      256   25   89                                
Order2      242   29   74                             
Order3      251   26   111                       
Order4      270   43   85                             
Order5      274   26   79        

然后我使用以下代码删除列名并替换第一行值:

colnames(NumbOrder2)<-NumbOrder1[,1]
NumbOrder3<-data.frame(NumbOrder2[-1,])

现在我得到了正确的桌子NumbOrder3

ChannelN    EXS   ISO  ISS 
Order1      256   25   89                                
Order2      242   29   74                             
Order3      251   26   111                       
Order4      270   43   85                             
Order5      274   26   79

但问题是:原始数据框中的列类是integer但现在它是factor。我无法使用这个新数据框绘制任何图表。我尝试转换与as.integer,但没有帮助。

保留原始数据框格式的任何解决方案?

3 个答案:

答案 0 :(得分:1)

问题在于将t转换为matix。矩阵只能在一个类上保存值。由于在data.frame中有因子和整数,整数将被保存为矩阵中的因子。

要获得您想要的内容,请先设置rownames( NumOrder2 的名称),删除factor-column然后转置

rownames(NumOrder1) <- NumOrder1$ChannelN
NumOrder1 <- NumOrder1[,-1]
NumOrder2 <- as.data.frame(t(NumOrder1))

检查它们是否为整数:

> lapply(NumOrder2,class)
$EXS
[1] "integer"

$ISO
[1] "integer"

$ISS
[1] "integer"

答案 1 :(得分:1)

使用mapply

x <- "ChannelN    EXS   ISO  ISS 
Order1      256   25   89                                
Order2      242   29   74                             
Order3      251   26   111                       
Order4      270   43   85                             
Order5      274   26   79"
df <- read.table(text=x, header=T)
df$EXS <- mapply(as.integer, df$EXS)
df$ISO <- mapply(as.integer, df$ISO)
df$ISS <- mapply(as.integer, df$ISS)
df
#   ChannelN EXS ISO ISS
# 1   Order1 256  25  89
# 2   Order2 242  29  74
# 3   Order3 251  26 111
# 4   Order4 270  43  85
# 5   Order5 274  26  79

答案 2 :(得分:1)

我们也可以使用recast

中的library(reshape2)执行此操作
library(reshape2)
res <- recast(df1, variable~ChannelN, value.var='value')
res
#  variable EXS ISO ISS
#1   Order1 256  25  89
#2   Order2 242  29  74
#3   Order3 251  26 111
#4   Order4 270  43  85
#5   Order5 274  26  79

str(res)
#'data.frame':   5 obs. of  4 variables:
#$ variable: Factor w/ 5 levels "Order1","Order2",..: 1 2 3 4 5
#$ EXS     : int  256 242 251 270 274
#$ ISO     : int  25 29 26 43 26
#$ ISS     : int  89 74 111 85 79