2017-12-08 84 views
5

मैंने लिपि में एक त्रुटि में भाग लिया है जो मैं लिख रहा हूं जो केवल तब होता है जब मेरे पास dplyr चल रहा है। मुझे पहली बार सामना करना पड़ा जब मुझे dplyr से एक फ़ंक्शन मिला जो मैं उपयोग करना चाहता था, जिसके बाद मैंने पैकेज स्थापित किया और चलाया। मैं स्तंभ मानों मैं इसे में सूचकांक के रूप में उपयोग करने के लिए जा रहा हूँ है कि एक्सेल से एक तालिका में पढ़ाdplyr अमान्य सबस्क्रिप्ट प्रकार सूची

पहले::

library(readxl) 
examplelist <- read_excel("example.xlsx") 

फ़ाइल की सामग्री रहे हैं: यहाँ मेरी त्रुटि का एक उदाहरण है

1 2 3 4 
1 1 4 1 
2 3 2 1 
4 4 1 4 

और फिर मैं एक डेटा फ्रेम का निर्माण:

testdf = data.frame(1:12, 13:24, 25:36, 37:48) 

और फिर मैं एक पाश एक फ़ंक्शन को कॉल किया है सूचकांक के रूप में examplelist के मानों का उपयोग करता है।

testfun <- function(df, a, b, c, d){ 
    value1 <- df[[a]] 
    value2 <- df[[b]] 
    value3 <- df[[c]] 
    value4 <- df[[d]] 
} 

for (i in 1:nrow(examplelist)){ 
    testfun(testdf, examplelist[i, 1], examplelist[i, 2], 
     examplelist[i, 3], examplelist[i, 4]) 
} 

जब मैं dplyr बिना इस स्क्रिप्ट को चलाने, सब कुछ ठीक है, लेकिन dplyr साथ यह मुझे त्रुटि देता है:

Error in .subset2(x, i, exact = exact) : invalid subscript type 'list' 

क्यों dplyr इस त्रुटि कारण होने के होता है, और मैं इसे कैसे ठीक कर सकते हैं?

उत्तर

4

मुझे लगता है कि MKR का जवाब एक मान्य हल है, मैं क्यों कुछ विकल्पों के साथ पर थोड़ा और विस्तार से बता देगा।

readxl पुस्तकालय tidyverse का हिस्सा है और समारोह read_excel के साथ एक Tibble (tbl_df) देता है। यह एक विशेष प्रकार का डेटा फ्रेम है और मूल व्यवहार से भिन्नताएं हैं, विशेष रूप से प्रिंटिंग और सबसेटिंग (here पढ़ें)।

Tibbles also clearly delineate [ and [[ : [ always returns another tibble, [[ always returns a vector. No more drop = FALSE

तो अब आप देख सकते हैं कि आपके examplelist[i, n] एक Tibble और लंबाई 1, जिसके कारण as.numeric काम करता है का उपयोग करने का नहीं एक सदिश वापस आ जाएगी।

library(readxl) 

examplelist <- read_excel("example.xlsx") 

class(examplelist[1, 1]) 
# [1] "tbl_df"  "tbl"  "data.frame" 

class(examplelist[[1, 1]]) 
# [1] "numeric" 

class(as.numeric(examplelist[1, 1])) 
# [1] "numeric" 

class(as.data.frame(examplelist)[1, 1]) 
# [1] "numeric" 

मेरे कार्यप्रवाह tidyverse का उपयोग कर ताकि आप [[ इस्तेमाल कर सकते हैं या as.data.frame सबसेट को अगर आप tibbles नहीं करना चाहती ओर जाता है।

2

मैं dplyr लोड किए बिना भी इस समस्या को देख सकता हूं। ऐसा लगता है कि अपराधी examplelist आइटम का उपयोग कर रहा है। यदि आप examplelist[1, 2] के मान को प्रिंट करते हैं तो यह 1x1 आयाम डेटा है। फ्रेम। लेकिन a, b, c and d का मान एक साधारण संख्या होने की उम्मीद है। इसलिए यदि आप as.numeric का उपयोग कर examplelist[i, 1] आदि बदलते हैं तो त्रुटि से बचा जाएगा। testfun के रूप में की कॉल बदलें:

testfun(testdf, as.numeric(examplelist[i, 1]), as.numeric(examplelist[i, 2]), 
      as.numeric(examplelist[i, 3]), as.numeric(examplelist[i, 4])) 
+0

यह काम करता है, लेकिन मुझे अभी भी समझ में नहीं आता है कि 'dplyr' लोडिंग क्यों' examplelist [1, 2] '(जिसे मैंने अब और बिना 'dplyr' के चेक किया है) के मान को बदल दिया है। मैं उम्मीद करता हूं कि डेटा फ्रेम को [ए, बी] के साथ सब्सक्राइब करते समय यह परिणाम को सरल बना देगा (या कम से कम यही है कि उन्नत आर ने मुझे बताया)। 'Dplyr' को उस व्यवहार को क्यों बदलना होगा, और कैसे? –

संबंधित मुद्दे