คำตอบอื่น ๆ แสดงให้คุณเห็นวิธีการที่จะทำให้รายการของ data.frames เมื่อคุณมีอยู่แล้วพวงของ data.frames, e กรัมd1
, d2
, .... มีชื่อตามลำดับเฟรมข้อมูลปัญหาและวางพวกเขาในรายการเป็น การแก้ไขที่ดี แต่วิธีปฏิบัติที่ดีที่สุดคือการหลีกเลี่ยงการมีกลุ่มข้อมูลที่ไม่ได้อยู่ในรายการตั้งแต่แรก
คำตอบอื่น ๆ ให้รายละเอียดมากมายเกี่ยวกับวิธีกำหนดเฟรมข้อมูลให้กับองค์ประกอบรายการเข้าถึงองค์ประกอบเหล่านั้น ฯลฯ เราจะกล่าวถึงเรื่องนี้เล็กน้อยที่นี่ด้วย แต่ประเด็นหลักคือการพูดว่าอย่ารอจนกว่าคุณจะมีกลุ่มdata.frames
เพื่อเพิ่มลงในรายการ เริ่มด้วยรายการ
ส่วนที่เหลือของคำตอบนี้จะครอบคลุมกรณีทั่วไปบางอย่างที่คุณอาจถูกล่อลวงให้สร้างตัวแปรตามลำดับและแสดงวิธีการตรงไปยังรายการ หากคุณยังใหม่ต่อรายการใน R คุณอาจต้องการอ่านความแตกต่างระหว่าง[[
และ[
ในการเข้าถึงองค์ประกอบของรายการคืออะไร .
รายการตั้งแต่เริ่มต้น
ไม่เคยสร้างd1
d2
d3
... dn
ตั้งแต่แรก สร้างรายการที่d
มีn
องค์ประกอบ
การอ่านหลายไฟล์ลงในรายการเฟรมข้อมูล
ทำได้ค่อนข้างง่ายเมื่ออ่านไฟล์ บางทีคุณอาจมีไฟล์data1.csv, data2.csv, ...
ในไดเรกทอรี เป้าหมายของคุณคือรายชื่อของ data.frames mydata
ที่เรียกว่า สิ่งแรกที่คุณต้องการคือเวกเตอร์ที่มีชื่อไฟล์ทั้งหมด คุณสามารถสร้างนี้กับวาง (เช่นmy_files = paste0("data", 1:5, ".csv")
) แต่มันอาจจะง่ายต่อการใช้ที่จะคว้าไฟล์ทั้งหมดที่เหมาะสม:list.files
my_files <- list.files(pattern = "\\.csv$")
คุณสามารถใช้นิพจน์ทั่วไปเพื่อจับคู่ไฟล์อ่านเพิ่มเติมเกี่ยวกับนิพจน์ทั่วไปในคำถามอื่น ๆ หากคุณต้องการความช่วยเหลือที่นั่น วิธีนี้คุณสามารถคว้าไฟล์ CSV ทั้งหมดแม้ว่าจะไม่เป็นไปตามรูปแบบการตั้งชื่อที่ดี หรือคุณสามารถใช้รูปแบบ regex ที่นักเล่นชื่นชอบหากคุณต้องการเลือกไฟล์ CSV บางไฟล์จากกลุ่มไฟล์เหล่านั้น
ณ จุดนี้ผู้เริ่มต้น R ส่วนใหญ่จะใช้for
ลูปและไม่มีอะไรผิดปกติกับมันทำงานได้ดี
my_data <- list()
for (i in seq_along(my_files)) {
my_data[[i]] <- read.csv(file = my_files[i])
}
วิธีที่คล้ายกันมากขึ้นที่จะทำมันคือlapply
ซึ่งเป็นทางลัดสำหรับข้างต้น
my_data <- lapply(my_files, read.csv)
แน่นอนแทนที่ฟังก์ชั่นการนำเข้าข้อมูลอื่น ๆread.csv
ตามความเหมาะสม readr::read_csv
หรือdata.table::fread
จะเร็วขึ้นหรือคุณอาจต้องการฟังก์ชั่นที่แตกต่างกันสำหรับไฟล์ประเภทอื่น
ไม่ว่าจะด้วยวิธีใดก็เป็นการสะดวกในการตั้งชื่อองค์ประกอบรายการให้ตรงกับไฟล์
names(my_data) <- gsub("\\.csv$", "", my_files)
# or, if you prefer the consistent syntax of stringr
names(my_data) <- stringr::str_replace(my_files, pattern = ".csv", replacement = "")
แยกกรอบข้อมูลเป็นรายการของกรอบข้อมูล
นี่คือฟังก์ชั่นพื้นฐานที่ง่ายsplit()
สำหรับคุณ คุณสามารถแยกตามคอลัมน์ (หรือคอลัมน์) ของข้อมูลหรืออะไรก็ได้ที่คุณต้องการ
mt_list = split(mtcars, f = mtcars$cyl)
# This gives a list of three data frames, one for each value of cyl
นี่เป็นวิธีที่ดีในการแยกเฟรมข้อมูลออกเป็นชิ้น ๆ เพื่อการตรวจสอบความถูกต้อง บางทีคุณอาจต้องการแบ่งmtcars
การฝึกอบรมการทดสอบและการตรวจสอบ
groups = sample(c("train", "test", "validate"),
size = nrow(mtcars), replace = TRUE)
mt_split = split(mtcars, f = groups)
# and mt_split has appropriate names already!
การจำลองรายการเฟรมข้อมูล
บางทีคุณอาจกำลังจำลองข้อมูลบางอย่างเช่นนี้:
my_sim_data = data.frame(x = rnorm(50), y = rnorm(50))
แต่ใครจะจำลองเพียงคนเดียว คุณต้องการทำสิ่งนี้ 100 ครั้ง 1,000 ครั้งมากกว่า! แต่คุณไม่ต้องการ 10,000 เฟรมข้อมูลในพื้นที่ทำงานของคุณ ใช้replicate
และวางไว้ในรายการ:
sim_list = replicate(n = 10,
expr = {data.frame(x = rnorm(50), y = rnorm(50))},
simplify = F)
โดยเฉพาะอย่างยิ่งในกรณีนี้คุณควรพิจารณาว่าคุณต้องการเฟรมข้อมูลแยกต่างหากหรือไม่หรือเฟรมข้อมูลเดี่ยวที่มีคอลัมน์ "กลุ่ม" ทำงานด้วยหรือไม่ การใช้data.table
หรือdplyr
การทำสิ่งต่าง ๆ "ตามกลุ่ม" เป็นเรื่องง่ายสำหรับกรอบข้อมูล
ฉันไม่ได้ใส่ข้อมูลของฉันไว้ในรายการ :( ฉันจะใช้ในครั้งต่อไป แต่ฉันจะทำอะไรได้บ้างตอนนี้
หากพวกเขาเป็นประเภทแปลก (ซึ่งผิดปกติ) คุณสามารถกำหนดพวกเขา:
mylist <- list()
mylist[[1]] <- mtcars
mylist[[2]] <- data.frame(a = rnorm(50), b = runif(50))
...
ถ้าคุณมีเฟรมข้อมูลชื่ออยู่ในรูปแบบเช่นdf1
, df2
, df3
และคุณต้องการให้พวกเขาในรายการคุณสามารถget
พวกเขาหากคุณสามารถเขียนนิพจน์ปกติเพื่อให้ตรงกับชื่อ สิ่งที่ต้องการ
df_list = mget(ls(pattern = "df[0-9]"))
# this would match any object with "df" followed by a digit in its name
# you can test what objects will be got by just running the
ls(pattern = "df[0-9]")
# part and adjusting the pattern until it gets the right objects.
โดยทั่วไปmget
จะใช้เพื่อรับวัตถุหลายรายการและส่งคืนวัตถุเหล่านั้นในรายการที่มีชื่อ คู่ของมันget
ถูกใช้เพื่อรับวัตถุเดียวและส่งคืนวัตถุนั้น (ไม่อยู่ในรายการ)
การรวมรายการเฟรมข้อมูลไว้ในกรอบข้อมูลเดียว
งานทั่วไปกำลังรวมรายการของเฟรมข้อมูลไว้ในกรอบข้อมูลขนาดใหญ่หนึ่งกรอบ ถ้าคุณต้องการที่จะวางซ้อนทับกันคุณจะใช้rbind
คู่กัน แต่สำหรับรายการของเฟรมข้อมูลที่นี่มีสามตัวเลือกที่ดี:
# base option - slower but not extra dependencies
big_data = do.call(what = rbind, args = df_list)
# data table and dplyr have nice functions for this that
# - are much faster
# - add id columns to identify the source
# - fill in missing values if some data frames have more columns than others
# see their help pages for details
big_data = data.table::rbindlist(df_list)
big_data = dplyr::bind_rows(df_list)
(ในทำนองเดียวกันการใช้cbind
หรือdplyr::bind_cols
สำหรับคอลัมน์)
ในการผสาน (เข้าร่วม) รายการของกรอบข้อมูลคุณสามารถดูคำตอบเหล่านี้ได้ บ่อยครั้งที่ความคิดคือการใช้Reduce
กับmerge
(หรือฟังก์ชั่นการเข้าร่วมอื่น ๆ ) เพื่อรวมเข้าด้วยกัน
ทำไมต้องใส่ข้อมูลในรายการ
ใส่ข้อมูลที่คล้ายกันในรายการเพราะคุณต้องการที่จะทำสิ่งที่คล้ายกับกรอบข้อมูลในแต่ละครั้งและฟังก์ชั่นเช่นlapply
, sapply
do.call
, แพคเกจและเก่าฟังก์ชั่นให้เป็นเรื่องง่ายที่จะทำ ตัวอย่างของคนที่ทำสิ่งต่าง ๆ ได้อย่างง่ายดายด้วยรายการต่างก็มีอยู่ทั่วpurrr
plyr
l*ply
แม้ว่าคุณจะใช้ต่ำต้อยสำหรับวงมันง่ายมากที่จะห่วงมากกว่าองค์ประกอบของรายการกว่าก็คือการสร้างชื่อตัวแปรที่มีและการเข้าถึงวัตถุที่มีpaste
get
ง่ายต่อการดีบักเช่นกัน
คิดว่าการปรับขยาย หากคุณต้องการจริงๆเพียงสามตัวแปรมันปรับให้ใช้งานd1
, ,d2
d3
แต่ถ้าปรากฎว่าคุณต้องการ 6 จริง ๆ นั่นคือการพิมพ์ที่มากขึ้น และครั้งต่อไปเมื่อคุณจำเป็นต้อง 10 หรือ 20 คุณพบว่าตัวเองคัดลอกและวางสายรหัสอาจจะใช้การค้นหา / แทนที่การเปลี่ยนแปลงd14
ไปd15
และคุณกำลังคิดนี้ไม่ได้เป็นวิธีการเขียนโปรแกรมที่ควรจะเป็น หากคุณใช้รายการความแตกต่างระหว่าง 3 ราย, 30 รายและ 300 รายเป็นรหัสบรรทัดหนึ่งบรรทัดมากที่สุด --- ไม่มีการเปลี่ยนแปลงเลยหากจำนวนกรณีของคุณถูกตรวจพบโดยอัตโนมัติเช่นจำนวน.csv
ไฟล์ที่คุณมี ไดเรกทอรี
คุณสามารถตั้งชื่อองค์ประกอบของรายการในกรณีที่คุณต้องการใช้สิ่งอื่นนอกเหนือจากดัชนีตัวเลขในการเข้าถึงเฟรมข้อมูลของคุณ (และคุณสามารถใช้ทั้งคู่นี่ไม่ใช่ตัวเลือก XOR)
โดยรวมแล้วการใช้รายการต่างๆจะทำให้คุณเขียนโค้ดที่สะอาดและอ่านง่ายขึ้นซึ่งจะส่งผลให้บั๊กน้อยลงและสับสนน้อยลง
=
ไม่ได้อยู่ภายใน<-
data.frame()
โดยการใช้<-
คุณสร้างy1
และy2
ในสภาพแวดล้อมทั่วโลกของคุณและกรอบข้อมูลของคุณไม่ใช่สิ่งที่คุณต้องการให้เป็น