重塑一个奇怪的清单

时间:2012-10-18 06:17:57

标签: r

这是一项非常具体的任务,但我相信从中学习可能足够通用。我有一个奇怪设计的时间戳数据集,我需要重塑,我需要操作基本安装附带的软件包。我认为看到比解释更容易。

带有时间戳的命名向量列表:

x <- structure(list(A = c("2.40", ":", "3.00", "5.01", "6.62", ":", 
    "7.00", "9.00"), B = c("2.40", "5.01", "6.62", ":", "7.00", "9.00"
    ), C = c("2.40", ":", "3.00", "5.01", "6.62", ":", "7.00", "9.00"
    )), .Names = c("A", "B", "C"))

列表如下:

> x
[[1]]
[1] "2.40" ":"    "3.00" "5.01" "6.62" ":"    "7.00" "9.00"

[[2]]
[1] "2.40" "5.01" "6.62" ":"    "7.00" "9.00"

[[3]]
[1] "2.40" ":"    "3.00" "5.01" "6.62" ":"    "7.00" "9.00"

我想要的是什么:

$A
     start      end  
1   "2.40"   "3.00"   
2   "5.01"   "5.01"    
3   "6.62"   "7.00"   
4   "9.00"   "9.00"  

$B
     start      end 
1   "2.40"   "2.40"   
2   "5.01"   "5.01"  
3   "6.62"   "7:00"   
4   "9.00"   "9.00"   

$C
     start      end 
1   "2.40"   "3.00"
2   "5.01"   "5.01" 
3   "6.62"   "7.00"
4   "9.00"   "9.00"

如果有冒号(:),左边的元素是起始值,右边的元素是结束值。如果元素没有触及冒号,则需要重复它,并且它是开始值和结束值。

注意:如果数据框与矩阵相比,结果将没有引号

1 个答案:

答案 0 :(得分:11)

这是你想要的吗?

> lapply(x, function(v)
+   data.frame(start = v[-c(f <- which(v==":"), f + 1)], 
+              end = v[-c(f, f-1)]))
$A
  start  end
1  2.40 3.00
2  5.01 5.01
3  6.62 7.00
4  9.00 9.00

$B
  start  end
1  2.40 2.40
2  5.01 5.01
3  6.62 7.00
4  9.00 9.00

$C
  start  end
1  2.40 3.00
2  5.01 5.01
3  6.62 7.00
4  9.00 9.00