列表中的R reshape和子集数据帧

时间:2015-07-12 13:47:26

标签: r dataframe

我的问题如下:我想在新数据帧中对每个数据帧的某些组合列进行子集化。我需要这样做,因为我希望每个DF分别进行进一步的计算。

1.我将我的数据组织在一个包含四个数据框的列表中,每个数据框包含一个变量一年。

  nms     <- c(paste0("tiva.EXGR.wide",c(1995,       
  2005)),paste0("tiva.VA.wide",c(1995, 2005)))
  df.list <- lapply(nms, get)

数据框1:出口措施1,1995年,26列:

 |COU |PAR | Time| C01T05| C10T14| C15T16|
 |:---|:---|----:|------:|------:|------:|
 |ARG |ARG | 1995|   0.00|   0.00|   0.00|
 |ARG |AUS | 1995|   0.83|   0.17|  14.87|
 |ARG |AUT | 1995|   1.66|   0.00|   2.59|

数据框2:出口措施2,1995年,26列:

 |COU |PAR | Time| C01T05| C10T14| C15T16|
 |:---|:---|----:|------:|------:|------:|
 |ARG |ARG | 2005|   0.00|   0.00|   0.00|
 |ARG |AUS | 2005|   2.50|   2.20|  22.48|
 |ARG |AUT | 2005|   3.57|   0.09|  13.64|

如果我要为所有数据帧重复它,我可以这样做。

tive.VA.2005.10t14&lt; -tiva.VA.2005.wide [,c(1,2,5)]

所以结果看起来像这样:

 |COU |    ARG|  AUS|  AUT|
 |:---|------:|----:|----:|
 |ARG |   0.00| 2.20| 0.09|
 |AUS | 492.73| 0.00| 8.36|
 |AUT |   0.05| 0.50| 0.00|
 |BEL |   0.26| 0.29| 1.30|
 |BGR |   0.01| 0.02| 1.19|
 |BRA | 823.07| 8.18| 0.92|

但我想以这样一种方式对其进行编程,以便运行循环并在新列表中创建数据框。在每个数据帧中,我想要包括三列,第一列和第二列来自列原始数据帧,然后是第三列,这些数据帧在每次迭代中继续运行。我试着这样做。

for (i in 4:26) {
  EXGR.1995<-NULL
  EXGR.2005<-NULL
  EXGR.1995[[i]]<-(df.list[[1]][,c(1,2,i)])
  EXGR.2005[[i]]<-(df.list[[3]][,c(1,2,i)])
  }

1 个答案:

答案 0 :(得分:0)

如果您将数据放在名为<?php $opening_hours = [ "Monday" => ["09:00", "17:00"], "Tuesday" => ["09:00", "17:00"], "Wednesday" => ["08:00", "13:00"], "Thursday" => ["09:00", "17:00"], "Friday" => ["09:00", "17:00"], "Saturday" => ["10:00", "16:00"], "Sunday" => ["Closed"], ]; $amountOfDays = count($opening_hours); $arrayKeys = array_keys($opening_hours); for($dayCount = 0; $dayCount < $amountOfDays; $dayCount++) { $DayAmountOfConsecutiveSameHours = 1; while(isset($arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]) && ($opening_hours[$arrayKeys[$dayCount]] === $opening_hours[$arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours)]])) $DayAmountOfConsecutiveSameHours++; if($DayAmountOfConsecutiveSameHours > 1) $result[$arrayKeys[$dayCount] . " - " . $arrayKeys[($dayCount+$DayAmountOfConsecutiveSameHours-1)]] = $opening_hours[$arrayKeys[$dayCount]]; else $result[$arrayKeys[$dayCount]] = $opening_hours[$arrayKeys[$dayCount]]; $dayCount += ($DayAmountOfConsecutiveSameHours - 1); } print_r($result); ?> 的列表中,则可以轻松地将整个数据转换为数据框:

Array
(
    [Monday - Tuesday] => Array
        (
            [0] => 09:00
            [1] => 17:00
        )

    [Wednesday] => Array
        (
            [0] => 08:00
            [1] => 13:00
        )

    [Thursday - Friday] => Array
        (
            [0] => 09:00
            [1] => 17:00
        )

    [Saturday] => Array
        (
            [0] => 10:00
            [1] => 16:00
        )

    [Sunday] => Array
        (
            [0] => Closed
        )

)

然后你可以尝试重塑你想要的东西。