通过列标题转换为数据点进行长距离转换

时间:2017-01-17 12:44:25

标签: r transform

我有一个"宽"将日期作为列标题的数据框。使用转换功能,我可以把它变成一个" long"数据帧。我需要将日期(列标题)作为实际数据点作为新变量。让我用类似的数据框来说明问题:

matrix <- matrix(round(runif(25)*10), nrow = 5, ncol = 5)
hospital_names <- c("Hosp A", "Hosp B", "Hosp C", "Hosp D", "Hosp E")
dates <- c("Jan 03", "Feb 03", "Mar 03", "Apr 03", "May 03")
df <- as.data.frame(matrix)
colnames(df) =  dates
df <- cbind(hospital_names, df)

这给出了一个如下所示的数据框:

  hospital_names Jan 03 Feb 03 Mar 03 Apr 03 May 03 
 1 Hosp A          10      3      1      9      2        
 2 Hosp B           8      5      8      6      0          
 3 Hosp C           9      1      9      2      5         
 4 Hosp D           4      0      7      0      4         
 5 Hosp E           0      8      9      2      4

我现在应用转换函数:

 df <- t(df)

得到这个:

                [,1]     [,2]     [,3]     [,4]     [,5]    
 hospital_names "Hosp A" "Hosp B" "Hosp C" "Hosp D" "Hosp E"
 Jan 03         "10"     "8"      "9"      "4"      "0"    
 Feb 03         "3"      "5"      "1"      "0"      "8"    
 Mar 03         "1"      "8"      "9"      "7"      "9"  
 Apr 03         "9"      "6"      "2"      "0"      "2"  
 May 03         "2"      "0"      "5"      "4"      "4" 

所以在这一点上,我的日期是实际的行名而不是​​数据点。我的问题是,有一个简单的解决方案吗?我可以将行名称转换为向量,然后使用cbind将其添加为变量吗?

1 个答案:

答案 0 :(得分:0)

欢迎来到R.使用一个包(如评论中建议的Reshape2)是一种方法,但是对于你在这里所做的事情的水平,我猜你想要一个更简单的解决方案来自基础R. / p>

有几点:

  • 通常不要在变量名中使用R函数名 (例如。testmat <- matrix(...)而不是matrix <- matrix(...))否则您可能会覆盖函数/变量。

  • “t”表示矩阵运算transpose,而不是转换,只是交换列和行。

那就是说,我想你想要这样的东西。

matx <- matrix(round(runif(25)*10), nrow = 5, ncol = 5)
hospital_names <- c("Hosp A", "Hosp B", "Hosp C", "Hosp D", "Hosp E")
dates <- c("Jan 03", "Feb 03", "Mar 03", "Apr 03", "May 03")
df2 <- data.frame(dates=dates,t(matx))
colnames(df2) <- c("dates",hospital_names)

其输出为:

   dates Hosp A Hosp B Hosp C Hosp D Hosp E
1 Jan 03      1      7      0      9      7
2 Feb 03      6      5      7      9      8
3 Mar 03     10     10      5      0      9
4 Apr 03      7      2      2      3      4
5 May 03      7      7      2      7      2

发生的事情是将矩阵保留为(数字)矩阵,将名称分开,然后在定义数据框时,将日期作为第一列(命名为“日期”,然后添加矩阵的转置(matx))。最后,使用concatenate在其他医院名称c(“dates”,hospital_names)前添加标题“dates”,在正确的位置获取所有正确的名称。

如果你真的希望你的“宽”格式转到“长”格式,那就是其他内容和链接在评论中。

require(reshape2)
melt(df2)

带输出

    dates variable value
1  Jan 03   Hosp A     1
2  Feb 03   Hosp A     6
3  Mar 03   Hosp A    10
4  Apr 03   Hosp A     7
5  May 03   Hosp A     7
6  Jan 03   Hosp B     7
7  Feb 03   Hosp B     5
8  Mar 03   Hosp B    10
9  Apr 03   Hosp B     2
10 May 03   Hosp B     7
11 Jan 03   Hosp C     0
12 Feb 03   Hosp C     7
13 Mar 03   Hosp C     5
14 Apr 03   Hosp C     2
15 May 03   Hosp C     2
16 Jan 03   Hosp D     9
17 Feb 03   Hosp D     9
18 Mar 03   Hosp D     0
19 Apr 03   Hosp D     3
20 May 03   Hosp D     7
21 Jan 03   Hosp E     7
22 Feb 03   Hosp E     8
23 Mar 03   Hosp E     9
24 Apr 03   Hosp E     4
25 May 03   Hosp E     2