[英]How to Split a Data Frame in R
我已經評估了一個文件,並且僅針對我需要的行進行了解析。 我將這些行保存為數據框,現在正在尋找一種將每個字段分為幾列的方法。 我的數據框代碼如下:
con <- file("dataSet.txt", "r")
lines <- c()
while(TRUE) {
line = readLines(con, 1)
if(length(line) == 0) break
else if(grepl("^\\s*F{1}", line) && grepl("(0,0)", line, fixed = TRUE))
lines <- c(lines, line)
}
lines <- data.frame(lines)
打印行時,顯示如下:
[1] F 20160525 08:22:06.838 F798256B GET 10.199.194.38:57708 wei2dt - "" "*li" 264 (0,0) "1.62 seconds (1.30 kilobits/sec)"
[2] F 20160525 08:28:26.920 F798256C GET 10.19.105.15:57708 wei2dt - "isi_audit_log.dmp-sv.tmp" "*dl" 69 (0,0) "0.29 seconds (1.93 kilobits/sec)"
[3] F 20160525 08:28:26.933 F798256E GET 10.19.105.15:57708 wei2dt - "CG0009-1364_GT_report.txt" "*dl" 34 (0,0) "0.01 seconds (34.0 kilobits/sec)"
[4] F 20160525 08:28:26.941 F798256F GET 10.19.105.15:57708 wei2dt - "./" "*li" 89 (0,0) "0.01 seconds (102 kilobits/sec)"
[5] F 20160525 08:29:12.717 7798256B SEND 10.19.105.15:57708 wei2dt - "isi_audit_log.dmp" "" 1019692009 (0,0) "38.05 seconds (214 megabits/sec)"
1741級:F 20160525 08:22:06.838 F798256B GET 10.199.194.38:57708 wei2dt-“”“ * li” 264(0,0)“ 1.62秒(1.30 kb / s)”
但是,我想將行分成多列,以便每個字段(用空格分隔)都在其自己的列中。 具體來說,我想將其拆分為標記為13列:
"Line ID"
"Date"
"Timestamp"
"Transfer ID"
""
"IP Address"
"Username"
"Encryption Level"
"Transferred File"
""
"Transferred Bytes"
"Error"
"Transfer Time Data"
空白字符串表示那些我不想命名的列。 我想將其余部分拆分成上面的列,如下所示:
F-線的標識符
20160525-日期(yyyymmdd)
17:52:38.791-時間戳(HH:MM:SS.sss)
F798259D-轉移標識符
156.145.15.85:46634-IP地址和相關端口
xqixh8sl-用戶名
AES-加密級別(可以是-(破折號))
“ /pcgc...fastq.gz”-傳輸的文件(在“”中)
“”-附加字符串(應為空“”)
2951144113-傳輸的字節
(0,0)-錯誤(目前僅考慮0,0的行)
“ 2289.47秒(10.3兆位/秒)”-有關傳輸的數據
提前謝謝你的幫助。
更新
根據要求,我將dput(head(lines,10))的結果放在下面。
"F 20160531 14:19:11.085 F7982871 GET 146.203.126.246:31947 xricf4xj AES \"/pcgc/public/Other/transcriptome/fastq/PCGC0069603_HS_TX__1-05846__v1_FC882_L2_p9of16_P2.fastq.gz\" \"\" 551700712 (0,0) \"12.42 seconds (355 megabits/sec)\""
"F 20160531 14:19:24.085 F7982872 GET 146.203.126.246:20198 xricf4xj AES \"/pcgc/public/Other/transcriptome/fastq/PCGC0069749_HS_TX__1-04056__v1_FC01060_L1_p3of12_P2.fastq.gz\" \"\" 592956993 (0,0) \"12.98 seconds (365 megabits/sec)\""
"F 20160531 14:20:04.881 F7982873 GET 146.203.126.246:37792 xricf4xj AES \"/pcgc/public/Other/transcriptome/fastq/PCGC0065337_HS_TX__1-02281__v1_FC504_L5_p4of6_P2.fastq.gz\" \"\" 1787507416 (0,0) \"40.76 seconds (351 megabits/sec)\""
"F 20160531 14:20:10.763 F7982874 GET 146.203.126.246:5683 xricf4xj AES \"/pcgc/public/Other/transcriptome/fastq/PCGC0065271_HS_TX__1-02626__v1_FC412_L1_p6of6_P2.fastq.gz\" \"\" 235573426 (0,0) \"5.86 seconds (321 megabits/sec)\""
"F 20160531 14:20:24.142 F7982875 GET 146.203.126.246:52946 xricf4xj AES \"/pcgc/public/CTD/transcriptome/fastq/PCGC0069557_HS_TX__1-00738__v1_FC864_L1_p3of7_P2.fastq.gz\" \"\" 619011108 (0,0) \"13.34 seconds (371 megabits/sec)\""
"F 20160531 14:20:36.823 F7982876 GET 146.203.126.246:12531 xricf4xj AES \"/pcgc/public/CTD/transcriptome/fastq/PCGC0065398_HS_TX__1-01907__v1_FC718_L1_p2of10_P1.fastq.gz\" \"\" 539231282 (0,0) \"12.63 seconds (341 megabits/sec)\""
"F 20160531 14:21:10.955 F7982877 GET 146.203.126.246:2531 xricf4xj AES \"/pcgc/public/LVOTO/transcriptome/fastq/PCGC0065300_HS_TX__1-00652__v1_FC437_L3_p1of6_P2.fastq.gz\" \"\" 1545568612 (0,0) \"34.10 seconds (363 megabits/sec)\""
"F 20160531 14:21:20.721 F7982878 GET 146.203.126.246:16699 xricf4xj AES \"/pcgc/public/Other/transcriptome/fastq/PCGC0065413_HS_TX__1-01894__v1_FC718_L1_p6of10_P1.fastq.gz\" \"\" 452830134 (0,0) \"9.73 seconds (372 megabits/sec)\""
"F 20160531 14:21:26.191 F7982879 GET 146.203.126.246:54154 xricf4xj AES \"/pcgc/public/Other/transcriptome/fastq/PCGC0065397_HS_TX__1-01894__v1_FC711_L2_p6of10_P2.fastq.gz\" \"\" 267729030 (0,0) \"5.45 seconds (393 megabits/sec)\""
"F 20160531 14:21:41.752 F798287A GET 146.203.126.246:55620 xricf4xj AES \"/pcgc/public/Other/transcriptome/fastq/PCGC0069744_HS_TX__1-05476__v1_FC971_L2_p1of12_P2.fastq.gz\" \"\" 670588883 (0,0) \"15.54 seconds (345 megabits/sec)\""
看起來像服務器日志; 您可以嘗試使用readr::read_log
:
library(readr)
txt <- readLines(n=5)
F 20160525 08:22:06.838 F798256B GET 10.199.194.38:57708 wei2dt - "" "*li" 264 (0,0) "1.62 seconds (1.30 kilobits/sec)"
F 20160525 08:28:26.920 F798256C GET 10.19.105.15:57708 wei2dt - "isi_audit_log.dmp-sv.tmp" "*dl" 69 (0,0) "0.29 seconds (1.93 kilobits/sec)"
F 20160525 08:28:26.933 F798256E GET 10.19.105.15:57708 wei2dt - "CG0009-1364_GT_report.txt" "*dl" 34 (0,0) "0.01 seconds (34.0 kilobits/sec)"
F 20160525 08:28:26.941 F798256F GET 10.19.105.15:57708 wei2dt - "./" "*li" 89 (0,0) "0.01 seconds (102 kilobits/sec)"
F 20160525 08:29:12.717 7798256B SEND 10.19.105.15:57708 wei2dt - "isi_audit_log.dmp" "" 1019692009 (0,0) "38.05 seconds (214 megabits/sec)"
read_log(paste(txt, collapse="\n"))
# X1 X2 X3 X4 X5 X6 X7 X8 X9
# 1 FALSE 20160525 08:22:06.838 F798256B GET 10.199.194.38:57708 wei2dt <NA>
# 2 FALSE 20160525 08:28:26.920 F798256C GET 10.19.105.15:57708 wei2dt <NA> isi_audit_log.dmp-sv.tmp
# 3 FALSE 20160525 08:28:26.933 F798256E GET 10.19.105.15:57708 wei2dt <NA> CG0009-1364_GT_report.txt
# 4 FALSE 20160525 08:28:26.941 F798256F GET 10.19.105.15:57708 wei2dt <NA> ./
# 5 FALSE 20160525 08:29:12.717 7798256B SEND 10.19.105.15:57708 wei2dt <NA> isi_audit_log.dmp
# X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22
# 1 *li 264 (0,0) 1.62 seconds (1.30 kilobits/sec)
# 2 *dl 69 (0,0) 0.29 seconds (1.93 kilobits/sec) <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 3 *dl 34 (0,0) 0.01 seconds (34.0 kilobits/sec) <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 4 *li 89 (0,0) 0.01 seconds (102 kilobits/sec)
# 5 1019692009 (0,0) 38.05 seconds (214 megabits/sec) <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# X23 X24 X25 X26 X27 X28 X29 X30 X31 X32 X33 X34 X35 X36
# 1
# 2 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 4
# 5 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
代替data.frame(lines)
使用
# call strsplit function, which splits the data by any white spaces
my_df <- data.frame( do.call( rbind, strsplit(my_data, ' ' ) ) )
my_cols <- c("Line ID","Date", "Timestamp","Transfer ID","", "IP Address",
"Username","Encryption Level", "Transferred File", "", "Transferred Bytes",
"Error", "Transfer Time Data")
稍后,您可以通過刪除不需要的數據框或將列合並為1列來進一步清理數據框。
# combine dataframe columns into a new column
my_df$`Transfer Time Data` <- paste(my_df$X13,my_df$X14,my_df$X15)
# remove columns
within(my_df, rm(X13,X14,X15))
這與工作無關,但是可以滿足您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.