2017-12-08 4 views
5

私が書いているスクリプトでエラーが発生しました。これは、dplyrを実行している場合にのみ発生します。最初に、私が使用したかったdplyrの機能を見つけたときにそれに遭遇しました。その後、パッケージをインストールして実行しました。ここに私のエラーの例です:dplyr無効な添字タイプリスト

まず私は、私はそれでインデックスとして使用するつもり列の値があるExcelから表を読み込む:

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の機能を持つチブル(tbl_df)を返します。これは特別なタイプのデータフレームであり、基本的な動作との違いがあります。特に、の印刷のサブセットhere)があります。

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

つまり、あなたのexamplelist[i, n]as.numeric作品を使用した理由である、長さ1のベクトルtibbleを返し、ないことを今見ることができます。

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" 

私のワークフローでは、あなたがtibblesをしたくないので、もしあなたがサブセットまたはas.data.frameする[[を使用することができtidyverseを使用して向かう傾向。

2

dplyrをロードせずにこの問題が発生することがあります。犯人はexamplelistのアイテムを使用しているようです。 examplelist[1, 2]の値を印刷すると、1x1 dimension data.frameになります。しかし、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'の有無をチェックしたものです)。 [a、b]を使ってデータフレームをサブセット化すると結果が簡単になります(少なくともAdvanced Rが教えてくれたことです)。どうして 'dplyr'を読み込むとその動作が変わるのですか? –

関連する問題