คำถามติดแท็ก data.table

แพ็คเกจ R data.table เป็นส่วนขยายของ data.frame ที่สร้างขึ้นเพื่อการวิเคราะห์ข้อมูลในหน่วยความจำที่รวดเร็ว ใช้แท็ก dt สำหรับแพ็คเกจ DataTables ด้วย Shiny (DT)

8
แปลงคลาสคอลัมน์ใน data.table
ฉันมีปัญหาในการใช้ data.table: ฉันจะแปลงคลาสคอลัมน์ได้อย่างไร นี่คือตัวอย่างง่ายๆ: ด้วย data.frame ฉันไม่มีปัญหาในการแปลงด้วย data.table ฉันไม่รู้วิธี: df <- data.frame(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10)) #One way: http://stackoverflow.com/questions/2851015/r-convert-data-frame-columns-from-factors-to-characters df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE) #Another way df[, "value"] <- as.numeric(df[, "value"]) library(data.table) dt <- data.table(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10)) dt <- data.table(lapply(dt, as.character), stringsAsFactors=FALSE) #Error in rep("", ncol(xi)) …
118 r  data.table 

2
วัตถุประสงค์ของการตั้งค่าคีย์ใน data.table คืออะไร?
ฉันใช้ data.table และมีฟังก์ชั่นมากมายที่ทำให้ฉันต้องตั้งค่าคีย์ (เช่นX[Y]) ด้วยเหตุนี้ฉันจึงต้องการทำความเข้าใจว่าคีย์ทำอะไรเพื่อที่จะตั้งค่าคีย์ในตารางข้อมูลของฉันได้อย่างถูกต้อง ?setkeyแหล่งข่าวคนหนึ่งผมอ่านเป็น setkey()จัดเรียง a data.tableและทำเครื่องหมายว่าเรียงลำดับแล้ว คอลัมน์ที่จัดเรียงเป็นกุญแจสำคัญ คีย์สามารถเป็นคอลัมน์ใดก็ได้ในลำดับใดก็ได้ คอลัมน์จะเรียงลำดับจากน้อยไปมากเสมอ ตารางมีการเปลี่ยนแปลงโดยการอ้างอิง ไม่มีการทำสำเนาเลยนอกจากหน่วยความจำที่ใช้งานได้ชั่วคราวที่มีขนาดใหญ่เท่ากับคอลัมน์ Takeaway ของฉันที่นี่คือคีย์จะ "เรียงลำดับ" data.table ซึ่งส่งผลให้เกิดผลคล้ายกับorder(). อย่างไรก็ตามมันไม่ได้อธิบายวัตถุประสงค์ของการมีคีย์ คำถามที่พบบ่อย data.table 3.2 และ 3.3 อธิบาย: 3.2 ฉันไม่มีคีย์บนโต๊ะขนาดใหญ่ แต่การจัดกลุ่มยังเร็วมาก ทำไมถึงเป็นเช่นนั้น? data.table ใช้การเรียงลำดับเลขฐาน ซึ่งเร็วกว่าอัลกอริทึมการจัดเรียงอื่น ๆ อย่างเห็นได้ชัด Radix เป็น specically ?base::sort.list(x,method="radix")สำหรับจำนวนเต็มเท่านั้นดู นี่เป็นสาเหตุหนึ่งที่ทำให้ setkey()รวดเร็ว เมื่อไม่มีการตั้งค่าคีย์หรือเราจัดกลุ่มในลำดับที่แตกต่างจากคีย์เราเรียกว่าคีย์เฉพาะกิจโดย 3.3 เหตุใดการจัดกลุ่มตามคอลัมน์ในคีย์จึงเร็วกว่าเฉพาะกิจโดย? เนื่องจากแต่ละกลุ่มอยู่ติดกันใน RAM จึงลดการดึงข้อมูลเพจและสามารถคัดลอกหน่วยความจำเป็นกลุ่ม ( memcpyใน C) …
113 r  data.table 

8
การล้างค่า "Inf" จาก R dataframe
ใน R ฉันมีการดำเนินการที่สร้างInfค่าบางอย่างเมื่อฉันแปลงดาต้าเฟรม ฉันต้องการเปลี่ยนInfค่าเหล่านี้ให้เป็นNAค่านิยม รหัสที่ฉันมีช้าสำหรับข้อมูลขนาดใหญ่มีวิธีที่เร็วกว่านี้ไหม สมมติว่าฉันมี dataframe ต่อไปนี้: dat <- data.frame(a=c(1, Inf), b=c(Inf, 3), d=c("a","b")) ต่อไปนี้ใช้งานได้ในกรณีเดียว: dat[,1][is.infinite(dat[,1])] = NA ดังนั้นฉันจึงสรุปมันด้วยลูปต่อไปนี้ cf_DFinf2NA <- function(x) { for (i in 1:ncol(x)){ x[,i][is.infinite(x[,i])] = NA } return(x) } แต่คิดไม่ถึงว่านี่คือการใช้พลังของอาร์จริงๆ
103 r  dataframe  data.table 

5
วิธีใดเร็วที่สุดในการรวม / เข้าร่วม data.frames ใน R?
ตัวอย่างเช่น (ไม่แน่ใจว่าตัวอย่างที่เป็นตัวแทนส่วนใหญ่): N <- 1e6 d1 <- data.frame(x=sample(N,N), y1=rnorm(N)) d2 <- data.frame(x=sample(N,N), y2=rnorm(N)) นี่คือสิ่งที่ฉันมีจนถึงตอนนี้: d <- merge(d1,d2) # 7.6 sec library(plyr) d <- join(d1,d2) # 2.9 sec library(data.table) dt1 <- data.table(d1, key="x") dt2 <- data.table(d2, key="x") d <- data.frame( dt1[dt2,list(x,y1,y2=dt2$y2)] ) # 4.9 sec library(sqldf) sqldf() sqldf("create index ix1 on …

6
รับค่าสูงสุดตามกลุ่ม
นี่คือกรอบข้อมูลตัวอย่าง: d <- data.frame( x = runif(90), grp = gl(3, 30) ) ฉันต้องการย่อยของdที่มีแถวกับด้านบน 5 ค่าสำหรับค่าของแต่ละxgrp การใช้ฐาน -R แนวทางของฉันจะเป็นดังนี้: ordered <- d[order(d$x, decreasing = TRUE), ] splits <- split(ordered, ordered$grp) heads <- lapply(splits, head) do.call(rbind, heads) ## x grp ## 1.19 0.8879631 1 ## 1.4 0.8844818 1 ## 1.12 0.8596197 1 …
93 r  data.table  dplyr 

5
เลือก / กำหนดให้กับ data.table เมื่อชื่อตัวแปรถูกเก็บไว้ในเวกเตอร์อักขระ
คุณอ้างถึงตัวแปรอย่างไรในdata.tableกรณีที่ชื่อตัวแปรถูกเก็บไว้ในเวกเตอร์อักขระ ตัวอย่างเช่นสิ่งนี้ใช้ได้กับdata.frame: df <- data.frame(col1 = 1:3) colname <- "col1" df[colname] <- 4:6 df # col1 # 1 4 # 2 5 # 3 6 ฉันจะดำเนินการเดียวกันนี้กับ data.table ได้อย่างไรไม่ว่าจะมีหรือไม่มี:=สัญกรณ์ สิ่งที่ชัดเจนของการdt[ , list(colname)]ใช้งานไม่ได้ (และฉันไม่คาดหวัง)
92 r  data.table 

4
dplyr บน data.table ฉันใช้ data.table จริงหรือ
ถ้าฉันใช้ไวยากรณ์dplyrกับdatatableฉันจะได้รับประโยชน์ด้านความเร็วทั้งหมดของ datatable ในขณะที่ยังใช้ไวยากรณ์ของ dplyr หรือไม่ กล่าวอีกนัยหนึ่งฉันใช้ datatable ผิดหรือไม่หากฉันค้นหาด้วยไวยากรณ์ dplyr หรือฉันจำเป็นต้องใช้ไวยากรณ์ที่สามารถจัดเก็บข้อมูลได้อย่างแท้จริงเพื่อควบคุมพลังทั้งหมดของมัน ขอบคุณล่วงหน้าสำหรับคำแนะนำใด ๆ ตัวอย่างรหัส: library(data.table) library(dplyr) diamondsDT <- data.table(ggplot2::diamonds) setkey(diamondsDT, cut) diamondsDT %>% filter(cut != "Fair") %>% group_by(cut) %>% summarize(AvgPrice = mean(price), MedianPrice = as.numeric(median(price)), Count = n()) %>% arrange(desc(Count)) ผล: # cut AvgPrice MedianPrice Count # 1 Ideal 3457.542 1810.0 …
92 r  data.table  dplyr 

1
ฉันควรใช้โอเปอเรเตอร์: = ใน data.table เมื่อใด
data.tableตอนนี้วัตถุมีตัวดำเนินการ: = อะไรทำให้ตัวดำเนินการนี้แตกต่างจากตัวดำเนินการกำหนดอื่น ๆ ทั้งหมด นอกจากนี้การใช้งานคืออะไรเร็วแค่ไหนและควรหลีกเลี่ยงเมื่อใด

5
แยกสตริงข้อความในคอลัมน์ data.table
ฉันมีสคริปต์ที่อ่านข้อมูลจากไฟล์ CSV เป็นไฟล์data.tableแล้วแยกข้อความในคอลัมน์หนึ่งออกเป็นคอลัมน์ใหม่หลายคอลัมน์ ฉันกำลังใช้ฟังก์ชันlapplyand strsplitเพื่อทำสิ่งนี้ นี่คือตัวอย่าง: library("data.table") df = data.table(PREFIX = c("A_B","A_C","A_D","B_A","B_C","B_D"), VALUE = 1:6) dt = as.data.table(df) # split PREFIX into new columns dt$PX = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 1)) dt$PY = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 2)) dt # PREFIX VALUE PX PY # 1: A_B 1 A B # 2: …
87 r  data.table 

7
วิธีใช้ฟังก์ชันเดียวกันกับทุกคอลัมน์ที่ระบุใน data.table
ฉันมี data.table ที่ฉันต้องการดำเนินการเดียวกันกับบางคอลัมน์ ชื่อของคอลัมน์เหล่านี้กำหนดเป็นเวกเตอร์อักขระ ในตัวอย่างนี้ฉันต้องการคูณคอลัมน์เหล่านี้ทั้งหมดด้วย -1 ข้อมูลของเล่นบางส่วนและเวกเตอร์ที่ระบุคอลัมน์ที่เกี่ยวข้อง: library(data.table) dt <- data.table(a = 1:3, b = 1:3, d = 1:3) cols <- c("a", "b") ตอนนี้ฉันทำแบบนี้โดยวนซ้ำเวกเตอร์อักขระ: for (col in 1:length(cols)) { dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))] } มีวิธีดำเนินการโดยตรงโดยไม่ต้องใช้ for loop หรือไม่?
87 r  data.table 

12
dplyr กลายพันธุ์ / แทนที่หลายคอลัมน์ในชุดย่อยของแถว
ฉันอยู่ระหว่างการลองใช้เวิร์กโฟลว์ที่ใช้ dplyr (แทนที่จะใช้ data.table ส่วนใหญ่ซึ่งฉันเคยชิน) และฉันเจอปัญหาที่ฉันไม่สามารถหาโซลูชัน dplyr ที่เทียบเท่าได้ . ฉันมักจะพบกับสถานการณ์ที่ฉันต้องอัปเดต / แทนที่หลายคอลัมน์ตามเงื่อนไขตามเงื่อนไขเดียว นี่คือตัวอย่างโค้ดพร้อมโซลูชัน data.table ของฉัน: library(data.table) # Create some sample data set.seed(1) dt <- data.table(site = sample(1:6, 50, replace=T), space = sample(1:4, 50, replace=T), measure = sample(c('cfl', 'led', 'linear', 'exit'), 50, replace=T), qty = round(runif(50) * 30), qty.exit = 0, …
86 r  data.table  dplyr 

5
data.table สอดแทรกค่า NA ในเชิงเส้นโดยไม่มีกลุ่ม
ฉันต้องการเติมค่า NA บางส่วนใน data.table โดยไม่มีกลุ่ม โปรดพิจารณาสารสกัดของ data.table นี้แทนเวลาและระยะทาง: library(data.table) df <- data.frame(time = seq(7173, 7195, 1), dist = c(31091.33, NA, 31100.00, 31103.27, NA, NA, NA, NA, 31124.98, NA,31132.81, NA, NA, NA, NA, 31154.19, NA, 31161.47, NA, NA, NA, NA, 31182.97)) DT<- data.table(df) ฉันต้องการใน DT data.table เพื่อเติมค่า NA ด้วยฟังก์ชันขึ้นอยู่กับค่าที่ไม่ใช่ NA ก่อน …
18 r  data.table 


1
ประโยชน์ด้านประสิทธิภาพของการโยงกับ ANDing เมื่อกรองตารางข้อมูล
ฉันติดนิสัยที่คล้ายกันในการทำงานเป็นแถวเดียว ตัวอย่างเช่นถ้าฉันต้องกรองa, bและcในตารางข้อมูลผมจะนำพวกเขาเข้าด้วยกันในหนึ่ง[]กับ ANDs เมื่อวานนี้ฉันสังเกตเห็นว่าในกรณีของฉันนี่เป็นตัวกรองช้าและเหลือเชื่อแทนการทดสอบ ฉันได้รวมตัวอย่างด้านล่างแล้ว ก่อนอื่นฉันจะสร้างตัวสร้างตัวเลขสุ่มโหลดdata.tableและสร้างชุดข้อมูลจำลอง # Set RNG seed set.seed(-1) # Load libraries library(data.table) # Create data table dt <- data.table(a = sample(1:1000, 1e7, replace = TRUE), b = sample(1:1000, 1e7, replace = TRUE), c = sample(1:1000, 1e7, replace = TRUE), d = runif(1e7)) ต่อไปฉันจะกำหนดวิธีการของฉัน วิธีแรกโซ่กรองด้วยกัน อันที่สอง ANDs …
12 r  data.table 

6
แยกคอลัมน์อักขระและรับชื่อฟิลด์ในสตริง
ฉันต้องการแยกคอลัมน์ที่มีข้อมูลออกเป็นหลายคอลัมน์ ฉันต้องการใช้tstrsplitแต่ข้อมูลชนิดเดียวกันนั้นไม่ได้อยู่ในลำดับเดียวกันในแถวต่างๆและฉันต้องการแยกชื่อของคอลัมน์ใหม่ภายในตัวแปร สิ่งสำคัญที่ควรทราบ: อาจมีข้อมูลจำนวนมาก (ฟิลด์เป็นตัวแปรใหม่) และฉันไม่รู้จักทั้งหมดดังนั้นฉันไม่ต้องการโซลูชัน "ฟิลด์ต่อฟิลด์" ด้านล่างเป็นตัวอย่างของสิ่งที่ฉันมี: library(data.table) myDT <- structure(list(chr = c("chr1", "chr2", "chr4"), pos = c(123L, 435L, 120L), info = c("type=3;end=4", "end=6", "end=5;pos=TRUE;type=2" )), class = c("data.table", "data.frame"), row.names = c(NA,-3L)) # chr pos info #1: chr1 123 type=3;end=4 #2: chr2 435 end=6 #3: chr4 120 end=5;pos=TRUE;type=2 …
11 r  data.table  reshape 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.