在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
答案 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