这是一项非常具体的任务,但我相信从中学习可能足够通用。我有一个奇怪设计的时间戳数据集,我需要重塑,我需要操作基本安装附带的软件包。我认为看到比解释更容易。
带有时间戳的命名向量列表:
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"
如果有冒号(:),左边的元素是起始值,右边的元素是结束值。如果元素没有触及冒号,则需要重复它,并且它是开始值和结束值。
注意:如果数据框与矩阵相比,结果将没有引号
答案 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