在R中将奇怪的data.frame转换为矩阵

时间:2014-11-14 05:11:47

标签: r

我有以下data.frame并在删除每个分隔符后转换为矩阵对象。

> data
  ID        COL1        COL2        COL3        COL4         COL5
1  1     1,2,3,4     5,6,7,8  9,10,11,12 13,14,15,16  17,18,19,20
2  2 11,12,13,14 15,16,17,18 19,20,21,22 23,24,25,26  27,28,29,30
3  3 21,22,23,24 25,26,27,28 29,30,31,32 33,34,35,36  37,38,39,40
4  4 31,32,33,34 35,36,37,38 39,40,41,42 43,44,45,46  47,48,49,50
5  5 41,42,43,44 45,46,47,48 49,50,51,52 53,54,55,56  57,58,59,60
6  6 51,52,53,54 55,56,57,58 59,60,61,62 63,64,65,66  67,68,69,70
7  7 61,62,63,64 65,66,67,68 69,70,71,72 73,74,75,76  77,78,79,80
8  8 71,72,73,74 75,76,77,78 79,80,81,82 83,84,85,86  87,88,89,90
9  9 81,82,83,84 85,86,87,88 89,90,91,92 93,94,95,96 97,98,99,100

===>

> data.new
  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]  [,21]
1   1    1    2    3    4    5    6    7    8     9    10    11    12    13    14    15    16    17    18    19     20
2   2   11   12   13   14   15   16   17   18    19    20    21    22    23    24    25    26    27    28    29     30
3   3   21   22   23   24   25   26   27   28    29    30    31    32    33    34    35    36    37    38    39     40
4   4   31   32   33   34   35   36   37   38    39    40    41    42    43    44    45    46    47    48    49     50
5   5   41   42   43   44   45   46   47   48    49    50    51    52    53    54    55    56    57    58    59     60
6   6   51   52   53   54   55   56   57   58    59    60    61    62    63    64    65    66    67    68    69     70
7   7   61   62   63   64   65   66   67   68    69    70    71    72    73    74    75    76    77    78    79     80
8   8   71   72   73   74   75   76   77   78    79    80    81    82    83    84    85    86    87    88    89     90
9   9   81   82   83   84   85   86   87   88    89    90    91    92    93    94    95    96    97    98    99    100

为此,我应该应用apply()的哪些功能?

提前致谢 肖恩

2 个答案:

答案 0 :(得分:3)

你根本不需要apply。您可以重新读取数据。尝试以下三种可能性。

在基础R中,(1)您可以按行将列粘贴在一起,然后使用read.csv

读取该文本
dc <- do.call(paste, c(data, list(sep = ",")))
unname(as.matrix(read.csv(text = dc, header = FALSE)))

或者,(2)直接使用scan

matrix(scan(text = dc, what = integer(), sep = ","), length(dc), byrow = TRUE)

或者,(3)您可以使用cSplit

中的splitstackshape
library(splitstackshape)
unname(as.matrix(cSplit(data, 2:6)))

答案 1 :(得分:2)

基于apply的解决方案:

t(apply(data, 1, function(x) as.numeric(unlist(strsplit(x, ",")))))

它如何运作?

函数apply用于将函数应用于数据框的每一行。字符向量以逗号分隔(strsplit)。这将返回一个列表。此列表将转换为unlist的向量。接下来,as.numeric用于将字符向量转换为数字向量。函数apply返回一个矩阵,其中列对应于原始数据框中的行。最后,函数t用于转置矩阵。