如何在 R 中对参差不齐的数据框使用函数
How to use a function to a ragged dataframe in R
我正在处理 45 个大型数据帧,每个数据帧 60 个极其混乱的时间序列数据。但它基本上归结为下面的两个数据框。我设法将它归结为这两种数据帧类型,第一种是 y 轴上的位置
Group1 Group2 Group3
0 0 0
1 1 1
3 2 4
5 3 7
5 8
9
names samples t0 XIncrement
Group1 4 0 2
Group2 5 1 2
Group3 7 2 3
我必须为每个小组创造时间。当我为单个组编写函数时效果很好,我得到了我想要的。
1.) t0 是开始时间
2.) xincrement 是每次采样之间的时间
3.) sample 是集合中的样本数。
4.) 时间是每次采样的时间
Time_function <- function(samples, t0, XIncrement) {
samples_2 <-c(1:samples)
Time <- ((samples_2* t0) +XIncrement)
return(Time)
#}
}
test_function <- Time_function(100, 200e-9, 500e-12)
我需要将它“应用于”每个组。我真的不确定如何使用这些信息创建一个新的数据框或将其添加到 df 的行中。
我尝试制作一个空数据框并以这种方式填充它,但没有成功。
当我转置数据并将其放入列表形式时,这似乎是最有用的形式,但我仍然无法将创建时间放入列表中。
已添加 为更清楚起见:每个组都有自己独特的时间,有些组比其他组抽样更多。
因此,最后我需要将 Group_1 与 Group1_Time、Group_2 与 Group2_Time 合并。数据框将参差不齐。
感谢您提供的任何帮助或指导。我用谷歌搜索并搜索了 Whosebug 以获取信息,但我空手而归。如果有这样的问题,很好,我还没有找到。
假设输入数据在下面的注释中可重复显示,此代码结合了列表 L
和数据框 DF
并假设更合适的数据结构,ts
class, 对于输出):
make_ts <- function(g, t0, xincr) ts(g, start = t0, deltat = xincr)
tt <- Map(make_ts, L, DF$t0, DF$XIncrement)
tt
给出 ts
个对象的列表:
$Group1
Time Series:
Start = 0
End = 6
Frequency = 0.5
[1] 0 1 3 5
$Group2
Time Series:
Start = 1
End = 9
Frequency = 0.5
[1] 0 1 2 3 5
$Group3
Time Series:
Start = 2
End = 17
Frequency = 0.333333333333333
[1] 0 1 4 7 8 9
请注意,我们可以恢复数据、时间、开始时间、deltat 和频率 (= 1/deltat) 并转换为这样的数据帧列表:
lapply(tt, c)
lapply(tt, time)
sapply(tt, start)
sapply(tt, deltat)
sapply(tt, frequency)
library(zoo)
lapply(tt, fortify.zoo)
备注
由于不可能有具有不同列长度的数据框,我们假设第一个数据结构是如图所示的列表,第二个是数据框。
L <- list(Group1 = c(0, 1, 3, 5), Group2 = c(0, 1, 2, 3, 5),
Group3 = c(0, 1, 4, 7, 8, 9))
DF <- structure(list(names = c("Group1", "Group2", "Group3"), samples = c(4L,
5L, 7L), t0 = 0:2, XIncrement = c(2L, 2L, 3L)), class = "data.frame", row.names = c(NA,
-3L))
我正在处理 45 个大型数据帧,每个数据帧 60 个极其混乱的时间序列数据。但它基本上归结为下面的两个数据框。我设法将它归结为这两种数据帧类型,第一种是 y 轴上的位置
Group1 Group2 Group3
0 0 0
1 1 1
3 2 4
5 3 7
5 8
9
names samples t0 XIncrement
Group1 4 0 2
Group2 5 1 2
Group3 7 2 3
我必须为每个小组创造时间。当我为单个组编写函数时效果很好,我得到了我想要的。 1.) t0 是开始时间 2.) xincrement 是每次采样之间的时间 3.) sample 是集合中的样本数。 4.) 时间是每次采样的时间
Time_function <- function(samples, t0, XIncrement) {
samples_2 <-c(1:samples)
Time <- ((samples_2* t0) +XIncrement)
return(Time)
#}
}
test_function <- Time_function(100, 200e-9, 500e-12)
我需要将它“应用于”每个组。我真的不确定如何使用这些信息创建一个新的数据框或将其添加到 df 的行中。 我尝试制作一个空数据框并以这种方式填充它,但没有成功。
当我转置数据并将其放入列表形式时,这似乎是最有用的形式,但我仍然无法将创建时间放入列表中。
已添加 为更清楚起见:每个组都有自己独特的时间,有些组比其他组抽样更多。
因此,最后我需要将 Group_1 与 Group1_Time、Group_2 与 Group2_Time 合并。数据框将参差不齐。
感谢您提供的任何帮助或指导。我用谷歌搜索并搜索了 Whosebug 以获取信息,但我空手而归。如果有这样的问题,很好,我还没有找到。
假设输入数据在下面的注释中可重复显示,此代码结合了列表 L
和数据框 DF
并假设更合适的数据结构,ts
class, 对于输出):
make_ts <- function(g, t0, xincr) ts(g, start = t0, deltat = xincr)
tt <- Map(make_ts, L, DF$t0, DF$XIncrement)
tt
给出 ts
个对象的列表:
$Group1
Time Series:
Start = 0
End = 6
Frequency = 0.5
[1] 0 1 3 5
$Group2
Time Series:
Start = 1
End = 9
Frequency = 0.5
[1] 0 1 2 3 5
$Group3
Time Series:
Start = 2
End = 17
Frequency = 0.333333333333333
[1] 0 1 4 7 8 9
请注意,我们可以恢复数据、时间、开始时间、deltat 和频率 (= 1/deltat) 并转换为这样的数据帧列表:
lapply(tt, c)
lapply(tt, time)
sapply(tt, start)
sapply(tt, deltat)
sapply(tt, frequency)
library(zoo)
lapply(tt, fortify.zoo)
备注
由于不可能有具有不同列长度的数据框,我们假设第一个数据结构是如图所示的列表,第二个是数据框。
L <- list(Group1 = c(0, 1, 3, 5), Group2 = c(0, 1, 2, 3, 5),
Group3 = c(0, 1, 4, 7, 8, 9))
DF <- structure(list(names = c("Group1", "Group2", "Group3"), samples = c(4L,
5L, 7L), t0 = 0:2, XIncrement = c(2L, 2L, 3L)), class = "data.frame", row.names = c(NA,
-3L))