แปลงรายการเป็นกรอบข้อมูล


513

ฉันมีรายการข้อมูลที่ซ้อนกัน ความยาวของมันคือ 132 และแต่ละรายการเป็นรายการความยาว 20 มีวิธีที่รวดเร็วในการแปลงโครงสร้างนี้เป็นกรอบข้อมูลที่มี 132 แถวและ 20 คอลัมน์ของข้อมูลหรือไม่?

นี่คือตัวอย่างข้อมูลบางส่วนที่จะทำงานกับ:

l <- replicate(
  132,
  list(sample(letters, 20)),
  simplify = FALSE
)

ดังนั้นคุณต้องการให้แต่ละองค์ประกอบรายการเป็นแถวของข้อมูลใน data.frame ของคุณหรือไม่
Joshua Ulrich

2
@RichieCotton มันไม่ใช่ตัวอย่างที่ถูกต้อง "แต่ละรายการเป็นรายการที่มีความยาว 20" และคุณได้แต่ละรายการคือรายการองค์ประกอบหนึ่งของเวกเตอร์ของความยาว 20
มาเร็ค

1
ไปงานปาร์ตี้สาย แต่ฉันไม่เห็นใครพูดถึงเรื่องนี้ซึ่งฉันคิดว่ามันมีประโยชน์มาก (สำหรับสิ่งที่ฉันกำลังมองหาที่จะทำ)
mflo-ByeSE


คำตอบ:


390

สมมติว่ารายการของคุณเรียกว่าl:

df <- data.frame(matrix(unlist(l), nrow=length(l), byrow=T))

ด้านบนจะแปลงคอลัมน์อักขระทั้งหมดให้เป็นปัจจัยเพื่อหลีกเลี่ยงปัญหานี้คุณสามารถเพิ่มพารามิเตอร์ให้กับการเรียก data.frame ():

df <- data.frame(matrix(unlist(l), nrow=132, byrow=T),stringsAsFactors=FALSE)

109
ระวังที่นี่หากข้อมูลของคุณไม่เหมือนกันทั้งหมด การส่งผ่านเมทริกซ์หมายความว่าข้อมูลทั้งหมดจะถูกบีบบังคับเป็นประเภทสามัญ คือถ้าคุณมีข้อมูลอักขระหนึ่งคอลัมน์และข้อมูลตัวเลขหนึ่งคอลัมน์ข้อมูลตัวเลขจะถูก coerced ไปยัง string โดย matrix () จากนั้นทั้งสองจะแยกตาม data.frame ()
Ian Sudbery

วิธีที่ดีที่สุดในการทำเช่นนี้คือเมื่อรายการมีค่าหายไปหรือรวม NA ในกรอบข้อมูล
เดฟ

1
@Dave: ทำงานให้ฉัน ... ดูที่นี่r-fiddle.org/#/fiddle?id=y8DW7lqL&version=3
nico

4
ระวังถ้าคุณมีประเภทข้อมูลตัวอักษร - data.frame จะแปลงเป็นปัจจัย
Alex Brown

4
@nico มีวิธีที่จะทำให้ชื่อองค์ประกอบของรายการเป็น colnames หรือ rownames ใน df หรือไม่?
N.Varela

472

กับ rbind

do.call(rbind.data.frame, your_list)

แก้ไข: การคืนค่าเวอร์ชันก่อนหน้าdata.frameของlistแทนที่จะเป็นเวกเตอร์ (ตามที่ @IanSudbery ชี้ให้เห็นในความคิดเห็น)


5
เหตุใดจึงทำงานได้ แต่rbind(your_list)ส่งกลับรายการเมทริกซ์ 1x32
eykanal

26
@eykanal do.callองค์ประกอบผ่านของอาร์กิวเมนต์ไปyour_list มันเทียบเท่าrbind rbind(your_list[[1]], your_list[[2]], your_list[[3]], ....., your_list[[length of your_list]])
Marek

2
วิธีนี้ทนทุกข์ทรมานจากสถานการณ์ที่เป็นโมฆะ
แฟรงค์วัง

3
@FrankWANG แต่วิธีนี้ไม่ได้ออกแบบมาเพื่อสถานการณ์ที่เป็นโมฆะ มันต้องyour_listมีเวกเตอร์ที่มีขนาดเท่ากัน NULLมีความยาว 0 ดังนั้นจึงควรล้มเหลว
Marek

12
วิธีนี้ดูเหมือนว่าจะส่งคืนวัตถุที่ถูกต้อง แต่ในการตรวจสอบวัตถุคุณจะพบว่าคอลัมน์เป็นรายการแทนที่จะเป็นเวกเตอร์ซึ่งอาจทำให้เกิดปัญหาในกรณีที่คุณไม่คาดหวัง
Ian Sudbery

135

คุณสามารถใช้plyrแพ็คเกจ ตัวอย่างเช่นรายการแบบซ้อนของแบบฟอร์ม

l <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
      , b = list(var.1 = 4, var.2 = 5, var.3 = 6)
      , c = list(var.1 = 7, var.2 = 8, var.3 = 9)
      , d = list(var.1 = 10, var.2 = 11, var.3 = 12)
      )

ตอนนี้มีความยาว 4 และแต่ละรายการในlประกอบด้วยรายการความยาว 3 อีกตอนนี้คุณสามารถเรียกใช้

  library (plyr)
  df <- ldply (l, data.frame)

และควรได้ผลลัพธ์เช่นเดียวกับในคำตอบ @Marek และ @nico


8
คำตอบที่ดี คุณช่วยอธิบายหน่อยได้ไหมว่ามันทำงานยังไง? มันจะส่งคืน data frame สำหรับแต่ละรายการหรือไม่?
Michael Barton

13
Imho คำตอบที่ดีที่สุด ส่งคืน data.frame ที่ซื่อสัตย์ ชนิดข้อมูลทั้งหมด (อักขระตัวเลข ฯลฯ ) ถูกแปลงอย่างถูกต้อง หากรายการมีประเภทข้อมูลที่แตกต่างกันพวกเขาจะถูกเปลี่ยนเป็นตัวละครด้วยmatrixวิธีการ
Roah

1
ตัวอย่างที่ให้ไว้ที่นี่ไม่ใช่ตัวอย่างที่ได้จากคำถาม ผลลัพธ์ของคำตอบนี้บนชุดข้อมูลดั้งเดิมไม่ถูกต้อง
MySchizoBuddy

ใช้งานได้ดีสำหรับฉัน! และชื่อของคอลัมน์ใน Data Frame ที่ได้นั้นจะถูกตั้งค่า! Tx
bAN

multicore plyr หรือไม่ หรือมีเวอร์ชัน lapply สำหรับใช้กับ mclapply?
Garglesoap

103

data.frame(t(sapply(mylistlist,c)))

sapplyแปลงเป็นเมทริกซ์ data.frameแปลงเมทริกซ์เป็นเฟรมข้อมูล


19
คำตอบที่ดีที่สุดโดยไกล! วิธีแก้ไขอื่น ๆ ไม่ได้รับชื่อประเภท / คอลัมน์ที่ถูกต้อง ขอบคุณ!
d_a_c321

1
คุณตั้งใจcจะเล่นบทบาทอะไรที่นี่ตัวอย่างหนึ่งของข้อมูลในรายการ โอ้เดี๋ยวก่อน c สำหรับฟังก์ชั่นการต่อเชื่อมใช่ไหม สับสนกับการใช้งานของ @ mnel ฉันยังเห็นด้วยกับ @dchandler การทำให้ชื่อคอลัมน์ถูกต้องเป็นสิ่งจำเป็นอย่างยิ่งในกรณีที่ฉันใช้งาน ทางออกที่ยอดเยี่ยม
jxramos

ฟังก์ชัน c มาตรฐานด้านขวานั้น จาก?c:Combine Values into a Vector or List
Alex Brown

1
ไม่ทำงานกับข้อมูลตัวอย่างที่ให้ไว้ในคำถาม
MySchizoBuddy

3
สิ่งนี้ไม่สร้าง data.frame ของรายการหรือไม่
คาร์ล

69

ถือว่ารายการของคุณเรียกว่าL,

data.frame(Reduce(rbind, L))

2
ทำได้ดีนี่! มีความแตกต่างเพียงอย่างเดียวกับโซลูชันของ @Alex Brown เมื่อเทียบกับของคุณการไปตามเส้นทางของคุณให้ข้อความเตือนต่อไปนี้ด้วยเหตุผลบางประการ: `ข้อความเตือน: ใน data.row.names (row.names, rowsi, i): บาง row.names ซ้ำกัน : 3,4 -> row. ชื่อไม่ได้ใช้ '
jxramos

ดีมาก!! ทำงานให้ฉันที่นี่: stackoverflow.com/questions/32996321/…
Anastasia Pupynina

2
ทำงานได้ดีเว้นแต่รายการจะมีองค์ประกอบเดียวในนั้นdata.frame(Reduce(rbind, list(c('col1','col2'))))สร้างเฟรมข้อมูลที่มี2 แถว 1 คอลัมน์ (ฉันคาดว่า 1 แถว 2 คอลัมน์)
The Red Pea

61

แพ็คเกจdata.tableนี้มีฟังก์ชั่นrbindlistการใช้งานที่รวดเร็วเป็นdo.call(rbind, list(...))พิเศษ

มันสามารถใช้รายการ lists, data.framesหรือdata.tables เป็นอินพุท

library(data.table)
ll <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
  , b = list(var.1 = 4, var.2 = 5, var.3 = 6)
  , c = list(var.1 = 7, var.2 = 8, var.3 = 9)
  , d = list(var.1 = 10, var.2 = 11, var.3 = 12)
  )

DT <- rbindlist(ll)

สิ่งนี้จะคืนค่าdata.tableสืบทอดมาจากdata.frameสืบทอดจาก

หากคุณจริงๆต้องการแปลงกลับไปใช้ data.frameas.data.frame(DT)


เกี่ยวกับบรรทัดสุดท้ายsetDFตอนนี้อนุญาตให้กลับไปที่ data.frame โดยการอ้างอิง
แฟรงค์

1
สำหรับรายการของฉันที่มีรายการ 30k รายการ rbindlist ทำงานเร็วกว่า ldply
tallharish

35

tibbleแพคเกจที่มีฟังก์ชั่นenframe()ที่แก้ปัญหานี้โดยการบีบบังคับซ้อนกันlistวัตถุที่ซ้อนกันtibble( "เรียบร้อย" กรอบข้อมูล) วัตถุ นี่คือตัวอย่างสั้น ๆ จากR สำหรับ Data Science :

x <- list(
    a = 1:5,
    b = 3:4, 
    c = 5:6
) 

df <- enframe(x)
df
#> # A tibble: 3 × 2
#>    name     value
#>   <chr>    <list>
#>    1     a <int [5]>
#>    2     b <int [2]>
#>    3     c <int [2]>

เนื่องจากคุณมีหลายรังอยู่ในรายชื่อของคุณlคุณสามารถใช้เพื่อลบทำรังที่ไม่จำเป็นที่จะได้รับเพียงรายชื่อลำดับชั้นเดียวและแล้วผ่านไปunlist(recursive = FALSE) enframe()ฉันใช้tidyr::unnest()เพื่อเอาท์พุทที่ไม่เลินเล่อในกรอบข้อมูลเดียว "เรียบร้อย" ซึ่งมีสองคอลัมน์ของคุณ (หนึ่งคอลัมน์สำหรับกลุ่มnameและอีกหนึ่งคอลัมน์สำหรับการสังเกตกับกลุ่มvalue) หากคุณต้องการคอลัมน์ที่มีความกว้างคุณสามารถเพิ่มคอลัมน์โดยใช้add_column()เพียงลำดับของค่าที่ซ้ำกัน 132 ครั้ง จากนั้นเพียงแค่spread()ค่า


library(tidyverse)

l <- replicate(
    132,
    list(sample(letters, 20)),
    simplify = FALSE
)

l_tib <- l %>% 
    unlist(recursive = FALSE) %>% 
    enframe() %>% 
    unnest()
l_tib
#> # A tibble: 2,640 x 2
#>     name value
#>    <int> <chr>
#> 1      1     d
#> 2      1     z
#> 3      1     l
#> 4      1     b
#> 5      1     i
#> 6      1     j
#> 7      1     g
#> 8      1     w
#> 9      1     r
#> 10     1     p
#> # ... with 2,630 more rows

l_tib_spread <- l_tib %>%
    add_column(index = rep(1:20, 132)) %>%
    spread(key = index, value = value)
l_tib_spread
#> # A tibble: 132 x 21
#>     name   `1`   `2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`  `10`  `11`
#> *  <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1      1     d     z     l     b     i     j     g     w     r     p     y
#> 2      2     w     s     h     r     i     k     d     u     a     f     j
#> 3      3     r     v     q     s     m     u     j     p     f     a     i
#> 4      4     o     y     x     n     p     i     f     m     h     l     t
#> 5      5     p     w     v     d     k     a     l     r     j     q     n
#> 6      6     i     k     w     o     c     n     m     b     v     e     q
#> 7      7     c     d     m     i     u     o     e     z     v     g     p
#> 8      8     f     s     e     o     p     n     k     x     c     z     h
#> 9      9     d     g     o     h     x     i     c     y     t     f     j
#> 10    10     y     r     f     k     d     o     b     u     i     x     s
#> # ... with 122 more rows, and 9 more variables: `12` <chr>, `13` <chr>,
#> #   `14` <chr>, `15` <chr>, `16` <chr>, `17` <chr>, `18` <chr>,
#> #   `19` <chr>, `20` <chr>

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

1
อ่าใช่ต้องมีคอลัมน์ดัชนีที่สามารถแพร่กระจายได้ ฉันจะอัปเดตในไม่ช้า
Matt Dancho

17

ขึ้นอยู่กับโครงสร้างของรายการของคุณมีtidyverseตัวเลือกบางอย่างที่ทำงานได้ดีกับรายการความยาวไม่เท่ากัน:

l <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
        , b = list(var.1 = 4, var.2 = 5)
        , c = list(var.1 = 7, var.3 = 9)
        , d = list(var.1 = 10, var.2 = 11, var.3 = NA))

df <- dplyr::bind_rows(l)
df <- purrr::map_df(l, dplyr::bind_rows)
df <- purrr::map_df(l, ~.x)

# all create the same data frame:
# A tibble: 4 x 3
  var.1 var.2 var.3
  <dbl> <dbl> <dbl>
1     1     2     3
2     4     5    NA
3     7    NA     9
4    10    11    NA

คุณยังสามารถผสมเวกเตอร์และกรอบข้อมูล:

library(dplyr)
bind_rows(
  list(a = 1, b = 2),
  data_frame(a = 3:4, b = 5:6),
  c(a = 7)
)

# A tibble: 4 x 2
      a     b
  <dbl> <dbl>
1     1     2
2     3     5
3     4     6
4     7    NA

ฟังก์ชัน dplyr :: bind_rows นี้ทำงานได้ดีแม้จะยากที่จะทำงานกับรายการที่มีต้นกำเนิดเป็น JSON จาก JSON ไปยัง dataframe ที่สะอาดอย่างน่าประหลาดใจ ดี
GGAnderson

@sbha ฉันพยายามใช้ df <- purrr :: map_df (l, ~ .x) แต่ดูเหมือนว่ามันไม่ทำงานข้อความแสดงข้อผิดพลาดที่ฉันมีคือ Error: คอลัมน์X2ไม่สามารถแปลงจากจำนวนเต็มเป็นตัวอักษรได้
Jolin

16

Reshape2 ให้ผลลัพธ์เช่นเดียวกับตัวอย่างของ plyr ด้านบน:

library(reshape2)
l <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
          , b = list(var.1 = 4, var.2 = 5, var.3 = 6)
          , c = list(var.1 = 7, var.2 = 8, var.3 = 9)
          , d = list(var.1 = 10, var.2 = 11, var.3 = 12)
)
l <- melt(l)
dcast(l, L1 ~ L2)

อัตราผลตอบแทน:

  L1 var.1 var.2 var.3
1  a     1     2     3
2  b     4     5     6
3  c     7     8     9
4  d    10    11    12

หากคุณมีพิกเซลใกล้หมดคุณสามารถทำได้ทั้งหมดใน 1 บรรทัดที่มีการรีสตาร์ต ()


12

วิธีนี้ใช้tidyverseแพคเกจ ( purrr )

รายการ:

x <- as.list(mtcars)

แปลงเป็น data data ( tibbleเฉพาะเจาะจงมากขึ้น):

library(purrr)
map_df(x, ~.x)

10

การเพิ่มคำตอบของ @ Marek: หากคุณต้องการหลีกเลี่ยงเงื่อนไขที่จะเปลี่ยนเป็นปัจจัยและประสิทธิภาพไม่ใช่เรื่องที่น่ากังวล

do.call(rbind, lapply(your_list, data.frame, stringsAsFactors=FALSE))

10

สำหรับกรณีทั่วไปของรายการที่ซ้อนกันอย่างลึกซึ้งที่มี 3 ระดับขึ้นไปเหมือนรายการที่ได้รับจาก JSON ที่ซ้อนกัน:

{
"2015": {
  "spain": {"population": 43, "GNP": 9},
  "sweden": {"population": 7, "GNP": 6}},
"2016": {
  "spain": {"population": 45, "GNP": 10},
  "sweden": {"population": 9, "GNP": 8}}
}

ลองพิจารณาวิธีmelt()การแปลงรายการที่ซ้อนเป็นรูปแบบสูงก่อน:

myjson <- jsonlite:fromJSON(file("test.json"))
tall <- reshape2::melt(myjson)[, c("L1", "L2", "L3", "value")]
    L1     L2         L3 value
1 2015  spain population    43
2 2015  spain        GNP     9
3 2015 sweden population     7
4 2015 sweden        GNP     6
5 2016  spain population    45
6 2016  spain        GNP    10
7 2016 sweden population     9
8 2016 sweden        GNP     8

ตามด้วยdcast()จากนั้นขยายให้กว้างอีกครั้งในชุดข้อมูลที่เป็นระเบียบซึ่งแต่ละตัวแปรจะสร้างคอลัมน์ aa และการสังเกตแต่ละครั้งจะสร้างแถว:

wide <- reshape2::dcast(tall, L1+L2~L3) 
# left side of the formula defines the rows/observations and the 
# right side defines the variables/measurements
    L1     L2 GNP population
1 2015  spain   9         43
2 2015 sweden   6          7
3 2016  spain  10         45
4 2016 sweden   8          9

9

คำตอบเพิ่มเติมพร้อมกับเวลาในคำตอบสำหรับคำถามนี้: วิธีที่มีประสิทธิภาพมากที่สุดในการส่งรายการเป็นกรอบข้อมูลคืออะไร?

วิธีที่เร็วที่สุดที่ไม่สร้างดาต้าเฟรมที่มีรายการแทนที่จะเป็นเวกเตอร์สำหรับคอลัมน์ดูเหมือนจะเป็น (จากคำตอบของ Martin Morgan):

l <- list(list(col1="a",col2=1),list(col1="b",col2=2))
f = function(x) function(i) unlist(lapply(x, `[[`, i), use.names=FALSE)
as.data.frame(Map(f(l), names(l[[1]])))

8

บางครั้งข้อมูลของคุณอาจเป็นรายการของเวกเตอร์ที่มีความยาวเท่ากัน

lolov = list(list(c(1,2,3),c(4,5,6)), list(c(7,8,9),c(10,11,12),c(13,14,15)) )

(เวกเตอร์ด้านในอาจเป็นรายการ แต่ฉันทำให้การอ่านง่ายขึ้น)

จากนั้นคุณสามารถทำการปรับเปลี่ยนต่อไปนี้ จำไว้ว่าคุณสามารถยกเลิกการทำรายการทีละระดับได้:

lov = unlist(lolov, recursive = FALSE )
> lov
[[1]]
[1] 1 2 3

[[2]]
[1] 4 5 6

[[3]]
[1] 7 8 9

[[4]]
[1] 10 11 12

[[5]]
[1] 13 14 15

ตอนนี้ใช้วิธีการโปรดของคุณที่กล่าวถึงในคำตอบอื่น ๆ :

library(plyr)
>ldply(lov)
  V1 V2 V3
1  1  2  3
2  4  5  6
3  7  8  9
4 10 11 12
5 13 14 15



3

สำหรับโซลูชันแบบขนาน (มัลติคอร์, multisession, ฯลฯ ) โดยใช้purrrตระกูลโซลูชันให้ใช้:

library (furrr)
plan(multisession) # see below to see which other plan() is the more efficient
myTibble <- future_map_dfc(l, ~.x)

ในกรณีที่lรายการ

เพื่อเปรียบเทียบประสิทธิภาพที่ดีที่สุดที่plan()คุณสามารถใช้:

library(tictoc)
plan(sequential) # reference time
# plan(multisession) # benchamark plan() goes here. See ?plan().
tic()
myTibble <- future_map_dfc(l, ~.x)
toc()

3

คำสั่งง่ายๆดังต่อไปนี้ทำงานสำหรับฉัน:

myDf <- as.data.frame(myList)

การอ้างอิง ( คำตอบ Quora )

> myList <- list(a = c(1, 2, 3), b = c(4, 5, 6))
> myList
$a
[1] 1 2 3

$b
[1] 4 5 6

> myDf <- as.data.frame(myList)
  a b
1 1 4
2 2 5
3 3 6
> class(myDf)
[1] "data.frame"

แต่สิ่งนี้จะล้มเหลวหากไม่ชัดเจนว่าจะแปลงรายการเป็น data data ได้อย่างไร:

> myList <- list(a = c(1, 2, 3), b = c(4, 5, 6, 7))
> myDf <- as.data.frame(myList)
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 3, 4

หมายเหตุ : คำตอบนั้นตรงกับชื่อของคำถามและอาจข้ามรายละเอียดของคำถาม


โปรดทราบว่าในการป้อนข้อมูลจากคำถามงานประเภทนี้เท่านั้น OP ขอแถว 132 และ 20 คอลัมน์ แต่จะให้ 20 แถวและ 132 คอลัมน์
Gregor Thomas

สำหรับตัวอย่างของคุณที่มีการป้อนความยาวแตกต่างกันซึ่งมันล้มเหลวมันไม่ชัดเจนว่าผลลัพธ์ที่ต้องการจะเป็นอย่างไร
Gregor Thomas

@Gregor True แต่ชื่อคำถามคือ "R - list to data frame" ผู้เข้าชมคำถามจำนวนมากและผู้ที่โหวตไม่ได้มีปัญหาที่แน่นอนของ OP จากชื่อคำถามพวกเขาแค่มองหาวิธีแปลงรายการเป็นกรอบข้อมูล ฉันเองก็มีปัญหาเดียวกันและวิธีการที่ฉันโพสต์แก้ไขปัญหาของฉัน
Ahmad

ใช่เพิ่งสังเกต ไม่ downvoting มันอาจเป็นเรื่องดีที่จะสังเกตคำตอบว่ามันทำสิ่งที่คล้ายกัน - แต่แตกต่างไปจาก - คำตอบอื่น ๆ ทั้งหมดค่อนข้างชัดเจน
Gregor Thomas

1

ระยะสั้น ( แต่อาจจะไม่เร็วที่สุด) วิธีการทำเช่นนี้จะเป็นฐานในการใช้ R เนื่องจากกรอบข้อมูลเป็นเพียงรายการของเวกเตอร์ยาวเท่ากัน ดังนั้นการแปลงระหว่างรายการอินพุตและ data.frame 30 x 132 ของคุณจะเป็น:

df <- data.frame(l)

จากนั้นเราสามารถแปลงเป็นเมทริกซ์ 132 x 30 และแปลงกลับเป็นดาต้าเฟรม:

new_df <- data.frame(t(df))

ในฐานะที่เป็นหนึ่งซับ:

new_df <- data.frame(t(data.frame(l)))

ชื่อแถวจะค่อนข้างน่ารำคาญในการดู แต่คุณสามารถเปลี่ยนชื่อได้เสมอ

rownames(new_df) <- 1:nrow(new_df)


2
ทำไมเรื่องนี้จึงถูกลดระดับลง ฉันอยากรู้ดังนั้นฉันจะไม่เผยแพร่ข้อมูลที่ผิดต่อไป
จะ C

ฉันทำสิ่งนี้มาก่อนโดยใช้ data.frame และ t! ฉันเดาว่าคนที่รู้สึกแย่จะมีวิธีที่ดีกว่าโดยเฉพาะผู้ที่ไม่ทำให้ชื่อสับสน
Arthur Yip

1
นั่นเป็นประเด็นที่ดีฉันคิดว่านี่เป็นสิ่งที่ไม่ถูกต้องหากคุณต้องการเก็บชื่อไว้ในรายการของคุณ
Will C

0

วิธีการใช้map_ฟังก์ชั่นร่วมกับforลูป? นี่คือทางออกของฉัน:

list_to_df <- function(list_to_convert) {
  tmp_data_frame <- data.frame()
  for (i in 1:length(list_to_convert)) {
    tmp <- map_dfr(list_to_convert[[i]], data.frame)
    tmp_data_frame <- rbind(tmp_data_frame, tmp)
  }
  print(tmp_data_frame)
}

โดยที่map_dfrแปลงองค์ประกอบของลิสต์แต่ละรายการเป็น data.frame จากนั้นrbindรวมองค์ประกอบทั้งหมด

ในกรณีของคุณฉันเดาว่าจะเป็น:

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