【问题标题】:R - data.table - group indexing approach for messy csv fileR - data.table - 混乱 csv 文件的组索引方法
【发布时间】:2017-11-23 16:45:12
【问题描述】:

我在学习 data.table 时遇到了困难,但我发现它的速度呈指数级增长。因此,我在这里向您请教 data.table 方法来解决我的问题。

我想通过data.table完成的任务如下: 假设我有一个 1200 万个 .csv 文件,其结构类似于:
注意:在真实文件中,每组有数百条记录。

1;  
0.00;0.01;0.00  
2;  
-0.00;0.01;-0.02  
-0.00;0.01;-0.01  
0.00;0.00;0.01  
3;  
0.00;0.01;0.00  
0.01;0.01;-0.00   
4;  
0.00;0.01;0.00   
-0.00;0.01;-0.02    
5;  
0.00;0.01;0.00  
0.01;0.01;-0.00  

整数表示 ID,而记录是属于该索引的观察值。答案是产生以下结果的解决方案:

Var_A <- c(0.00, -0.00, -0.00, 0.00,0.01,0.00,0.01,-0.00,0.00,0.01) 
Var_B <- c(0.01, 0.01, 0.01, 0.01,0.01,0.01,0.01,0.01,0.01,0.01)  
Var_C <- c(0.00, -0.02, -0.01,0.00,-0.00,0.00,-0.00,-0.02,0.00,-0.00)   
ID <- c(1, 2, 2, 2, 3, 3,4,4,5,5) 
solution_df <- data.frame(Var_A, Var_B, Var_C, ID)

希望问题很清楚,我向您提供了示例数据,我等待您的帮助 :)

谢谢。

【问题讨论】:

    标签: r indexing data.table


    【解决方案1】:

    我们可以使用readLines读取数据集,然后使用str_count根据;的数量创建一个逻辑向量,然后通过逻辑向量的累积和创建'ID'。然后用逻辑向量对数据进行子集化,用read.tablecbind用'ID'读取

    library(stringr)
    i1 <- str_count(lines, ";")==1
    cbind(ID = cumsum(i1)[!i1], read.table(text=lines[!i1], sep=";"))
    

    数据

    lines <- readLines(textConnection(
    "1;
    0.00;0.01;0.00
    2;
    -0.00;0.01;-0.02
    -0.00;0.01;-0.01
    0.00;0.00;0.01
    3;
    0.00;0.01;0.00
    0.01;0.01;-0.00
    4;
    0.00;0.01;0.00
    0.01;0.01;-0.00
    -0.00;0.01;-0.02
    5;
    0.00;0.01;0.00
    0.01;0.01;-0.00")) 
    
    #Or read from the file
    lines <- readLines('file.csv')
    

    【讨论】:

    • 感谢您的快速回复,非常酷!但是,我可能没有正确解释自己,因为这不是我解决实际问题所需的方法
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2015-07-20
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多