为每行

时间:2017-11-08 14:15:02

标签: r data.table

我有一个数据表(称之为 df ),其中包含许多列(变量),表示每个点的观察(一行)的数据值时间(一个变量=一个时间点),为简单起见,V1 - 时间= 1的值,V5 - 时间= 5的值等。

人工df例子:

df <- data.table( 
id = seq_len(4),  
start = c(2, 3, 1, 3),  
length = c(2, 3, 4, 1),  
v1 = rep(0.9), v2 = rep(0.8), v3 = rep(0.7), v4 = rep(0.6), v5 = rep(0.5))

此外,此表还包含另外两个变量:感兴趣的开始时间和时间间隔的长度,从开始时间算起,让我们称之为 start 和的 长度

根据以下原则,我想创建一个新表(让我们称之为 newdf ): 如果 df 的第一行, 开始 = 2, 长度 = 2,然后 newdf 的第一行将包含V2和V3中的值, newdf 中的所有其他变量< / strong>空着。 如果第二行 df 开始 = 3, 长度 = 3,然后 newdf 将包含第二行中V3,V4,V5的值等

我想要的输出看起来像这样(手工构建)

newdf <- data.table(
id = seq_len(4),
t1 = c(0.8, 0.7, 0.9, 0.7),
t2 = c(0.7, 0.6, 0.8, NA),
t3 = c(NA, 0.5, 0.7, NA),
t4 = c(NA, NA, 0.6, NA))

基本上,当 df 包含每个观察的绝对时间测量值时, newdf 将包含相同的测量值,但每次观察的相对时间。

显而易见且无效的方法是通过手动循环遍历行来构建新的数据表,但我真的想在数据表环境中解决它。代码

newdf <- df[, .SD, by=id, .SDcols=(column numbers I need)]

接近我想要的东西(特别是如果将它放入循环中),除了我无法弄清楚如何提取并将不断变化的(在每行df上)列数传递给SDcols而不循环,如果这甚至可能吗? (甚至忽略了选定数量的列可能不同的事实)

我最亲近的人问过这样的问题,就在这里:Selecting different numbers of columns on each row of a data frame,但结果并不是我想要的结果。

我还试过创建一个选择函数,然后在j中为.SD对象运行lapply,有点

newdf <- df[, (new.names):=lapply(.SD, fff) , by=id, .SDcols=-1]

但又遇到同样的问题,我无法从 开始 长度 变量中提取值< strong> df ,然后用于列选择。

0 个答案:

没有答案