ฉันจะสร้างรายการเฟรมข้อมูลได้อย่างไร


186

ฉันจะสร้างรายการเฟรมข้อมูลได้อย่างไรและฉันจะเข้าถึงเฟรมข้อมูลแต่ละรายการจากรายการได้อย่างไร

ตัวอย่างเช่นฉันจะวางเฟรมข้อมูลเหล่านี้ในรายการได้อย่างไร

d1 <- data.frame(y1 = c(1, 2, 3),
                 y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
                 y2 = c(6, 5, 4))

13
นี่คือคำตอบในคู่ แต่ก็คุ้มค่าที่มีความคิดเห็นที่มองเห็นได้ที่นี่เกินไป: ใช้=ไม่ได้อยู่ภายใน<- data.frame()โดยการใช้<-คุณสร้างy1และy2ในสภาพแวดล้อมทั่วโลกของคุณและกรอบข้อมูลของคุณไม่ใช่สิ่งที่คุณต้องการให้เป็น
Gregor Thomas

37
ดูระเบียบของรหัสที่ไม่มีช่องว่างและ<-s อยู่ใน data.frame () สิ่งใหม่ที่ฉันเป็น
Ben

5
ไม่อีกแล้ว. ฉันเพิ่งแก้ไขคำถามของคุณเพื่อแก้ไขการจัดรูปแบบรหัส อย่าลังเลที่จะยกเลิกถ้าคุณรู้สึกคิดถึง
Claus Wilke

คำตอบ:


133

สิ่งนี้ไม่เกี่ยวข้องกับคำถามของคุณ แต่คุณต้องการใช้=และไม่ได้<-อยู่ในการเรียกใช้ฟังก์ชัน หากคุณใช้<-คุณจะได้รับการสร้างตัวแปรy1และy2ในสภาพแวดล้อมที่คุณกำลังทำงาน:

d1 <- data.frame(y1 <- c(1, 2, 3), y2 <- c(4, 5, 6))
y1
# [1] 1 2 3
y2
# [1] 4 5 6

สิ่งนี้จะไม่มีผลตามที่ต้องการในการสร้างชื่อคอลัมน์ในกรอบข้อมูล:

d1
#   y1....c.1..2..3. y2....c.4..5..6.
# 1                1                4
# 2                2                5
# 3                3                6

=ผู้ประกอบการบนมืออื่น ๆ data.frameที่จะเชื่อมโยงเวกเตอร์ของคุณด้วยข้อโต้แย้ง

สำหรับคำถามของคุณการสร้างรายการของเฟรมข้อมูลนั้นง่าย:

d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
my.list <- list(d1, d2)

คุณเข้าถึงเฟรมข้อมูลเหมือนกับที่คุณเข้าถึงองค์ประกอบรายการอื่น ๆ :

my.list[[1]]
#   y1 y2
# 1  1  4
# 2  2  5
# 3  3  6

344

คำตอบอื่น ๆ แสดงให้คุณเห็นวิธีการที่จะทำให้รายการของ 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, แพคเกจและเก่าฟังก์ชั่นให้เป็นเรื่องง่ายที่จะทำ ตัวอย่างของคนที่ทำสิ่งต่าง ๆ ได้อย่างง่ายดายด้วยรายการต่างก็มีอยู่ทั่วpurrrplyr l*ply

แม้ว่าคุณจะใช้ต่ำต้อยสำหรับวงมันง่ายมากที่จะห่วงมากกว่าองค์ประกอบของรายการกว่าก็คือการสร้างชื่อตัวแปรที่มีและการเข้าถึงวัตถุที่มีpaste getง่ายต่อการดีบักเช่นกัน

คิดว่าการปรับขยาย หากคุณต้องการจริงๆเพียงสามตัวแปรมันปรับให้ใช้งานd1, ,d2 d3แต่ถ้าปรากฎว่าคุณต้องการ 6 จริง ๆ นั่นคือการพิมพ์ที่มากขึ้น และครั้งต่อไปเมื่อคุณจำเป็นต้อง 10 หรือ 20 คุณพบว่าตัวเองคัดลอกและวางสายรหัสอาจจะใช้การค้นหา / แทนที่การเปลี่ยนแปลงd14ไปd15และคุณกำลังคิดนี้ไม่ได้เป็นวิธีการเขียนโปรแกรมที่ควรจะเป็น หากคุณใช้รายการความแตกต่างระหว่าง 3 ราย, 30 รายและ 300 รายเป็นรหัสบรรทัดหนึ่งบรรทัดมากที่สุด --- ไม่มีการเปลี่ยนแปลงเลยหากจำนวนกรณีของคุณถูกตรวจพบโดยอัตโนมัติเช่นจำนวน.csvไฟล์ที่คุณมี ไดเรกทอรี

คุณสามารถตั้งชื่อองค์ประกอบของรายการในกรณีที่คุณต้องการใช้สิ่งอื่นนอกเหนือจากดัชนีตัวเลขในการเข้าถึงเฟรมข้อมูลของคุณ (และคุณสามารถใช้ทั้งคู่นี่ไม่ใช่ตัวเลือก XOR)

โดยรวมแล้วการใช้รายการต่างๆจะทำให้คุณเขียนโค้ดที่สะอาดและอ่านง่ายขึ้นซึ่งจะส่งผลให้บั๊กน้อยลงและสับสนน้อยลง


2
คุณแนะนำหนังสือเล่มใดที่ครอบคลุมการทำงานกับรายการ
Derelict

15
ผมขอแนะนำให้อ่านคำถามและคำตอบเกี่ยวกับกองมากเกินที่ได้รับการติดแท็กด้วยทั้งสองและr list
Gregor Thomas

2
@ Gregor ฉันต้องการเพิ่มว่าเราสามารถหลีกเลี่ยงการตั้งชื่อองค์ประกอบของรายการเพื่อให้ตรงกับไฟล์เพียงแค่โดยการกำหนดmy_data <- NULLมากกว่า 'my_data <- list ()'! :)
Daniel

6
เป็นไปได้ แต่my_data <- list()ทำให้ชัดเจนว่าคุณกำลังสร้างรายการซึ่งดีมาก! รหัสที่ชัดเจนเป็นสิ่งที่ดี ฉันไม่เห็นประโยชน์ใด ๆ ในการใช้my_data <- NULLแทน
Gregor Thomas

3
ฉันเห็นด้วยเกี่ยวกับสิ่งที่คุณพูด แต่อย่างที่ฉันพูดการทำเช่นนั้นคุณสามารถหลีกเลี่ยงขั้นตอนการตั้งชื่อไฟล์ได้ names(my_data) <- gsub("\\.csv$", "", my_files) ;) <br> แต่ฉันเคารพคำแนะนำของคุณในขณะที่ฉันกำลังเรียนรู้มากมายจากพวกเขาในฐานะมือใหม่และฉันซาบซึ้งจริงๆ :)
Daniel

21

คุณยังสามารถคอลัมน์การเข้าถึงโดยเฉพาะและค่าในองค์ประกอบแต่ละรายการด้วย และ[ [[นี่คือตัวอย่างบางส่วน อันดับแรกเราสามารถเข้าถึงได้เฉพาะคอลัมน์แรกของแต่ละเฟรมข้อมูลในรายการด้วยlapply(ldf, "[", 1)โดยที่1หมายถึงหมายเลขคอลัมน์

ldf <- list(d1 = d1, d2 = d2)  ## create a named list of your data frames
lapply(ldf, "[", 1)
# $d1
#   y1
# 1  1
# 2  2
# 3  3
#
# $d2
#   y1
# 1  3
# 2  2
# 3  1

ในทำนองเดียวกันเราสามารถเข้าถึงค่าแรกในคอลัมน์ที่สองด้วย

lapply(ldf, "[", 1, 2)
# $d1
# [1] 4
# 
# $d2
# [1] 6

จากนั้นเรายังสามารถเข้าถึงค่าคอลัมน์โดยตรงในฐานะเวกเตอร์ด้วย [[

lapply(ldf, "[[", 1)
# $d1
# [1] 1 2 3
#
# $d2
# [1] 3 2 1

13

หากคุณมีเฟรมข้อมูลที่มีชื่อเรียงตามลำดับจำนวนมากคุณสามารถสร้างรายการชุดย่อยของเฟรมข้อมูลที่ต้องการดังนี้:

d1 <- data.frame(y1=c(1,2,3), y2=c(4,5,6))
d2 <- data.frame(y1=c(3,2,1), y2=c(6,5,4))
d3 <- data.frame(y1=c(6,5,4), y2=c(3,2,1))
d4 <- data.frame(y1=c(9,9,9), y2=c(8,8,8))

my.list <- list(d1, d2, d3, d4)
my.list

my.list2 <- lapply(paste('d', seq(2,4,1), sep=''), get)
my.list2

โดยที่my.list2ส่งคืนรายการที่มีเฟรมข้อมูล 2, 3 และ 4

[[1]]
  y1 y2
1  3  6
2  2  5
3  1  4

[[2]]
  y1 y2
1  6  3
2  5  2
3  4  1

[[3]]
  y1 y2
1  9  8
2  9  8
3  9  8

อย่างไรก็ตามโปรดทราบว่าเฟรมข้อมูลในรายการด้านบนจะไม่มีชื่ออีกต่อไป หากคุณต้องการสร้างรายการที่มีชุดย่อยของเฟรมข้อมูลและต้องการรักษาชื่อของพวกเขาคุณสามารถลอง:

list.function <-  function() { 

     d1 <- data.frame(y1=c(1,2,3), y2=c(4,5,6))
     d2 <- data.frame(y1=c(3,2,1), y2=c(6,5,4))
     d3 <- data.frame(y1=c(6,5,4), y2=c(3,2,1))
     d4 <- data.frame(y1=c(9,9,9), y2=c(8,8,8))

     sapply(paste('d', seq(2,4,1), sep=''), get, environment(), simplify = FALSE) 
} 

my.list3 <- list.function()
my.list3

ซึ่งผลตอบแทน:

> my.list3
$d2
  y1 y2
1  3  6
2  2  5
3  1  4

$d3
  y1 y2
1  6  3
2  5  2
3  4  1

$d4
  y1 y2
1  9  8
2  9  8
3  9  8

> str(my.list3)
List of 3
 $ d2:'data.frame':     3 obs. of  2 variables:
  ..$ y1: num [1:3] 3 2 1
  ..$ y2: num [1:3] 6 5 4
 $ d3:'data.frame':     3 obs. of  2 variables:
  ..$ y1: num [1:3] 6 5 4
  ..$ y2: num [1:3] 3 2 1
 $ d4:'data.frame':     3 obs. of  2 variables:
  ..$ y1: num [1:3] 9 9 9
  ..$ y2: num [1:3] 8 8 8

> my.list3[[1]]
  y1 y2
1  3  6
2  2  5
3  1  4

> my.list3$d4
  y1 y2
1  9  8
2  9  8
3  9  8

2
แทนที่จะlapply(foo, get)ใช้เพียงmget(foo)
Gregor Thomas

9

เมื่อพิจารณาตามที่คุณมีจำนวน data.frames "ใหญ่" ที่มีชื่อคล้ายกัน (ที่นี่ d # โดยที่ # คือจำนวนเต็มบวก) ต่อไปนี้เป็นการปรับปรุงวิธีการ @ mark-miller เล็กน้อย มันคือสั้นมากขึ้นและผลตอบแทนการตั้งชื่อรายการ data.frames ที่ชื่อในแต่ละรายการคือชื่อของ data.frame เดิมที่สอดคล้องกัน

ที่สำคัญคือการใช้ร่วมกับmget lsหากเฟรมข้อมูล d1 และ d2 ที่ให้ไว้ในคำถามเป็นวัตถุเดียวที่มีชื่อ d # ในสภาพแวดล้อมดังนั้น

my.list <- mget(ls(pattern="^d[0-9]+"))

ซึ่งจะกลับมา

my.list
$d1
  y1 y2
1  1  4
2  2  5
3  3  6

$d2
  y1 y2
1  3  6
2  2  5
3  1  4

วิธีนี้ใช้ประโยชน์จากการโต้แย้งรูปแบบlsซึ่งช่วยให้เราสามารถใช้การแสดงออกปกติในการแยกชื่อของวัตถุในสภาพแวดล้อม ทางเลือกในการ regex ไม่เป็น"^d[0-9]+$""^d\\d+$"

ในฐานะที่เป็น @ ผู้รวบรวมชี้ให้เห็นมันเป็นภาพรวมที่ดีกว่าในการตั้งค่ากระบวนการสร้างข้อมูลของคุณเพื่อให้ data.frames ถูกใส่ไว้ในรายการที่มีชื่อในตอนเริ่มต้น

ข้อมูล

d1 <- data.frame(y1 = c(1,2,3),y2 = c(4,5,6))
d2 <- data.frame(y1 = c(3,2,1),y2 = c(6,5,4))

3

นี่อาจจะสายไปสักหน่อย แต่กลับไปที่ตัวอย่างของคุณฉันคิดว่าฉันจะขยายคำตอบแค่ตาด

 D1 <- data.frame(Y1=c(1,2,3), Y2=c(4,5,6))
 D2 <- data.frame(Y1=c(3,2,1), Y2=c(6,5,4))
 D3 <- data.frame(Y1=c(6,5,4), Y2=c(3,2,1))
 D4 <- data.frame(Y1=c(9,9,9), Y2=c(8,8,8))

จากนั้นคุณสร้างรายการของคุณได้อย่างง่ายดาย:

mylist <- list(D1,D2,D3,D4)

ตอนนี้คุณมีรายการ แต่แทนที่จะเข้าถึงรายการแบบเก่าเช่น

mylist[[1]] # to access 'd1'

คุณสามารถใช้ฟังก์ชั่นนี้เพื่อรับและกำหนดดาต้าเฟรมที่คุณต้องการ

GETDF_FROMLIST <- function(DF_LIST, ITEM_LOC){
   DF_SELECTED <- DF_LIST[[ITEM_LOC]]
   return(DF_SELECTED)
}

ตอนนี้รับคนที่คุณต้องการ

D1 <- GETDF_FROMLIST(mylist, 1)
D2 <- GETDF_FROMLIST(mylist, 2)
D3 <- GETDF_FROMLIST(mylist, 3)
D4 <- GETDF_FROMLIST(mylist, 4)

หวังว่าบิตพิเศษจะช่วยได้

ไชโย!


2
ใช่ฉันรู้ แต่ด้วยเหตุผลบางอย่างเมื่อฉันคัดลอกและวางทุกอย่างไปที่หมวก :( ในกรณีใด ๆ รหัสในกรณีที่ใช้งานได้
ML_for_now

4
ฉันอยากรู้ว่าทำไมคุณGETDF_FROMLIST(mylist, 1)ถึงชอบmylist[[1]]? หากคุณต้องการฟังก์ชั่นไวยากรณ์คุณสามารถทำได้"[["(mylist, 1)โดยไม่ต้องกำหนดฟังก์ชั่นที่กำหนดเอง
Gregor Thomas

4
คุณสามารถทำให้นิยามฟังก์ชันของคุณง่ายขึ้นได้ทั้งร่างกายของฟังก์ชันอาจreturn(DF_LIST[[ITEM_LOC]])ไม่จำเป็นต้องกำหนดตัวแปรกลาง
Gregor Thomas

1

ง่ายมาก ! นี่คือคำแนะนำของฉัน:

หากคุณต้องการเลือก dataframes ในเวิร์กสเปซลอง:

Filter(function(x) is.data.frame(get(x)) , ls())

หรือ

ls()[sapply(ls(), function(x) is.data.frame(get(x)))]

สิ่งเหล่านี้จะให้ผลลัพธ์เดียวกัน

คุณสามารถเปลี่ยนis.data.frameเพื่อตรวจสอบตัวแปรประเภทอื่น ๆ เช่นis.function


1

ฉันคิดว่าตัวเองเป็นมือใหม่ที่สมบูรณ์ แต่ฉันคิดว่าฉันมีคำตอบที่ง่ายมากสำหรับหนึ่งในคำถามย่อยดั้งเดิมที่ไม่ได้ระบุที่นี่: การเข้าถึงเฟรมข้อมูลหรือบางส่วนของมัน

เริ่มต้นด้วยการสร้างรายการด้วยกรอบข้อมูลตามที่ระบุไว้ข้างต้น:

d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))

d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))

my.list <- list(d1, d2)

จากนั้นหากคุณต้องการเข้าถึงค่าเฉพาะในหนึ่งในเฟรมข้อมูลคุณสามารถทำได้โดยใช้วงเล็บคู่ตามลำดับ ชุดแรกนำคุณเข้าสู่กรอบข้อมูลและชุดที่สองนำคุณไปสู่พิกัดเฉพาะ:

my.list[[1]][[3,2]]

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