एक स्तंभ बनाएँ जहाँ एक सूची है


80

मुझे पता है कि सूची स्तंभ कैसे जोड़ा जाता है:

> df <- data.frame(a=1:3)
> df$b <- list(1:1, 1:2, 1:3)
> df
  a       b
1 1       1
2 2    1, 2
3 3 1, 2, 3

यह काम करता है, लेकिन नहीं:

> df <- data.frame(a=1:3, b=list(1:1, 1:2, 1:3))
Error in data.frame(1L, 1:2, 1:3, check.names = FALSE, stringsAsFactors = TRUE) : 
  arguments imply differing number of rows: 1, 2, 3

क्यों?

इसके अलावा, वहाँ एक dfकॉल करने के लिए (ऊपर) बनाने के लिए एक रास्ता है data.frame?

जवाबों:


103

थोड़ा अस्पष्ट, से ?data.frame:

यदि किसी सूची या डेटा फ़्रेम या मैट्रिक्स को 'data.frame' में पास किया जाता है, तो ऐसा होता है जैसे कि प्रत्येक घटक या स्तंभ को एक अलग तर्क के रूप में पारित किया गया था (वर्ग के मॉडल "मैट्रिम्स" को छोड़कर) और जिन्हें 'I' द्वारा संरक्षित किया गया है। ' ) का है।

(महत्व दिया)।

इसलिए

data.frame(a=1:3,b=I(list(1,1:2,1:3)))

काम करने लगता है।


17
रुचि रखने वालों के लिए, "I" का अर्थ है "वस्तुओं के अवरोधन / रूपांतरण को रोकना"। यह एक समान वस्तु बनाता है लेकिन कक्षाओं के सेट में "एएसआई" के साथ जोड़ा जाता है। "AsIs" वर्ग वास्तव में सिर्फ डेटा.फ्रेम () और सूत्र () फ़ंक्शन द्वारा पढ़ा जाना है। यहाँ और जानें ।
pwilcox

2
अद्भुत, समाधान के लिए धन्यवाद। हालाँकि बस I
इनहिबिट इंटरप्रिटेशन

@pwilcox बहुत दिलचस्प है। क्या किसी वस्तु को कॉल करने की विधि है यह समझने के लिए कि क्या यह मेरे द्वारा संरक्षित है? मुझे लगता है कि यह है class()? जैसे I(iris) -> i; i %>% class() 3 [1] "AsIs" "data.frame"(रिटर्न असीस वर्ग)
stevec

33

यदि आप साथ काम कर रहे हैं data.tables, तो आप कॉल से बच सकते हैंI()

library(data.table)
# the following works as intended
data.table(a=1:3,b=list(1,1:2,1:3))

   a     b
1: 1     1
2: 2   1,2
3: 3 1,2,3

यह data.tableएक व्यापक अंतर से एक अविकसित विशेषता है
डेटा राजकुमारी

22

data_frameरों (विभिन्न कहा जाता है tibbles, tbl_df, tbl) मूल रूप से का उपयोग कर सूची स्तंभों के निर्माण का समर्थन data_frameनिर्माता। उनका उपयोग करने के लिए, उनके साथ कई पुस्तकालयों में से एक को लोड करें, जैसे कि tibble, dplyrया tidyverse

> data_frame(abc = letters[1:3], lst = list(1:3, 1:3, 1:3))
# A tibble: 3 × 2
    abc       lst
  <chr>    <list>
1     a <int [3]>
2     b <int [3]>
3     c <int [3]>

वे वास्तव data.framesमें हुड के नीचे हैं, लेकिन कुछ हद तक संशोधित। वे लगभग हमेशा सामान्य के रूप में इस्तेमाल किया जा सकता है data.frames। एकमात्र अपवाद मैंने पाया है कि जब लोग अनुचित श्रेणी की जांच करते हैं, तो वे समस्याएं पैदा करते हैं:

> #no problem
> data.frame(x = 1:3, y = 1:3) %>% class
[1] "data.frame"
> data.frame(x = 1:3, y = 1:3) %>% class == "data.frame"
[1] TRUE
> #uh oh
> data_frame(x = 1:3, y = 1:3) %>% class
[1] "tbl_df"     "tbl"        "data.frame"
> data_frame(x = 1:3, y = 1:3) %>% class == "data.frame"
[1] FALSE FALSE  TRUE
> #dont use if with improper testing!
> if(data_frame(x = 1:3, y = 1:3) %>% class == "data.frame") "something"
Warning message:
In if (data_frame(x = 1:3, y = 1:3) %>% class == "data.frame") "something" :
  the condition has length > 1 and only the first element will be used
> #proper
> data_frame(x = 1:3, y = 1:3) %>% inherits("data.frame")
[1] TRUE

मैं आर 4 डेटा साइंस (फ्री) में उनके बारे में पढ़ने की सिफारिश कर रहा हूं ।


1
आर बढ़ रहा है और बढ़ रहा है और मुझे लगता है कि यह प्रश्न का 2018 का उत्तर है और किसी भी तरह इसे चिह्नित किया जाना चाहिए।
फिट्जराय होग्सफ्लेश

यदि यह पर्याप्त लोकप्रिय है तो यह शीर्ष पर पहुंच जाएगा। हम में से बहुत से अभी भी बेस आर का उपयोग करते हैं ...
बेन बोल्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.