具有嵌套向量

时间:2017-01-29 18:59:32

标签: r

背景

在R中,这有效:

> df <- data.frame(a=numeric(), b=numeric())
> rbind(df, list(a=1, b=2))
  a b
1 1 2

但如果我希望列表有一个向量,则rbind失败:

> df <- data.frame(a=numeric(), b=vector(mode="numeric"))
> rbind(df, list(a=1, b=c(2,3)))
Error in rbind(deparse.level, ...) : 
  invalid list argument: all variables should have the same length

如果我尝试指定向量长度,则声明数据帧失败:

> df <- data.frame(a=numeric(), b=vector(mode="numeric", length=2))
Error in data.frame(a = numeric(), b = vector(mode = "numeric", length = 2)) : 
  arguments imply differing number of rows: 0, 2

最后,如果我避免声明数据帧并直接尝试rbind两个列表,那么看起来就像一切正常,但数据类型都是错误的,并且没有列似乎存在。

> l1 <- list(a=1, b=c(2,3))
> l2 <- list(a=10, b=c(20,30))
> obj <- rbind(l1, l2)
> obj
   a  b        
l1 1  Numeric,2
l2 10 Numeric,2
> typeof(obj)
[1] "list"
> obj$a
NULL
> obj$b
NULL
> names(obj)
NULL

我的设置

我有一个嵌入式设备,每隔50ms收集一次数据并吐出一个数据包。在我的脚本中,我正在解析一个波形,该波形代表该进程的状态(处理前一帧并传输,收集新数据,没有任何反应的死区时间)与状态机。对于每个数据包,我正在计算处理周期的持续时间,采集数据周期被细分为8个或16个采集周期,其中我计算每个采集周期的时间,以及剩余的死区时间。

我的列表基本上看起来像`list(process =#,cycles = c(#,#,#,#),deadtime =#)。不同的数据包类型具有不同的周期长度,因此我将其作为参数传递,我希望脚本能够在任何数据包时间内工作。

我的问题

有没有办法声明一个能做我想要的数据帧,或者我是否以一种根本错误的方式使用R并且我应该将每个周期分解为它自己的列表元素?我希望避免使用后者,因为它会使周期更难以处理。

我会注意到我刚刚开始学习R所以我可能正在做一些奇怪的事情。

预期输出

如果我用3 acq处理4个数据包的信号。每个周期,这将是我的理想输出:

df <- data.frame(processTime=numeric(), cyles=???, deadtime=numeric())
df <- rbind(df, list(processTime=0.05, cycles=c(0.08, 0.10, 0.07), deadtime=0.38)
etc...

  processTime cycles           deadtime
1 0.05        0.08 0.10 0.07   0.38
2 0.06        0.07 0.11 0.09   0.36
3 0.07        0.28 0.11 0.00   0.00
4 0.06        0.08 0.08 0.09   0.41

1 个答案:

答案 0 :(得分:1)

我会采取不同的措施。只处理前2条记录。

processTime<-c(.05,.06)
cycles<-list(list(.08,.10,.07), list(.07,.09,.38))
deadtime<-c(.38,.36)

对于循环,我们创建了一个列表元素,其中包含一个包含3个元素的列表。所以cycle [[1]] [1]将引用.08,而cycle [[1]] [2]将引用第一个列表的第二个元素,而cycle [[2]] [3]将引用第3个项目在第二个列表中。

如果我们使用cbind绑定这些,我们得到以下内容:

test<-as.data.frame(cbind(processTime,cycles,deadtime))
test

  processTime           cycles deadtime
1        0.05 0.08, 0.10, 0.07     0.38
2        0.06 0.07, 0.09, 0.38     0.36

test $ cycles [[1]]将返回第一个列表

test$cycles[[1]]
[[1]]
[[1]][[1]]
[1] 0.08

[[1]][[2]]
[1] 0.1

[[1]][[3]]
[1] 0.07

而第二个列表的第3个元素可以用:

调用
test$cycles[[2]][3]
[[1]]
[1] 0.38

您也可以稍后重新列出进行计算:

unlist(test$cycles[[2]])
[1] 0.07 0.09 0.38

按照您的要求迭代地执行此操作。

test<-data.frame()
     processTime<-c(.05)
     cycles<-list(list(.08,.10,.07))
     deadtime<-c(.38)
     test<-as.data.frame(cbind(processTime,cycles,deadtime))
test

  processTime           cycles deadtime
1        0.05 0.08, 0.10, 0.07     0.38  


     processTime<-c(.06)
     cycles<-list(list(.07,.09,.38))
     deadtime<-c(.36)
test<- rbind(test,as.data.frame(cbind(processTime,cycles,deadtime)))
test 

  processTime           cycles deadtime
1        0.05 0.08, 0.10, 0.07     0.38
2        0.06 0.07, 0.09, 0.38     0.36