dplyr:「n()のエラー:関数を直接呼び出さないでください」


96

dplyrパッケージの例の1つを再現しようとしていますが、このエラーメッセージが表示されます。各組み合わせの頻度で生成される新しい列nが表示されることを期待しています。何が欠けていますか?パッケージがロードされていることを3回チェックしました。

 library(dplyr)
# summarise peels off a single layer of grouping
by_vs_am <- group_by(mtcars, vs, am)

by_vs <- summarise(by_vs_am, n = n())

n()のエラー:この関数を直接呼び出すことはできません

回答:


120

私はあなたが同じセッションでロードしているdplyrと思いますplyrdplyrはありませんplyr。パッケージのddply関数ではありませんdplyr

両方dplyrplyr機能を持っていますsummarise/ summarize

の結果を見て、conflicts()マスクされたオブジェクトを確認します。


31
解決策は、plyr最初にロードすることを確認することです
ハドリー2014

16
@ User1257894が言うsummarizeように、このようなパッケージで使用しますdplyr::summarize(count = n())
Rafa Barragan

39

前の回答で述べたように、plyrとdplyrの間に競合がある可能性があります。このコマンドを実行して、plyrパッケージをアンロードできます。

detach("package:plyr", unload=TRUE) 

その後、期待どおりに続行できます。

library(dplyr) 
...
summarise(n = n()) 

まさに...要約と要約の間に矛盾がありました。また、プロジェクトの1つに誤ってロードplyrしてdplyrパッケージ化したところ、この競合に気づきました。いい仕事仲間。
Manoj Kumar

26

マスキング関数との混同を避けるために、以下の例のように、「package :: function」指定を使用することは明らかです。

delay <- dplyr::summarise(by_tailnum, 
  count = n(), 
  dist = mean(distance, na.rm = TRUE), 
  delay = mean(arr_delay, na.rm = TRUE))

8

別のケースでは、このエラーは次のコードで発生しました。

library(dplyr) # dplyr 0.5.0
library(lazyeval)

df <- data_frame(group = c(1, 2, 2, 3, 3, 3))

g <- "group"

df %>%
  group_by_(g) %>%
  summarise_(
    n = n(),
    sum = interp(~sum(col, na.rm = TRUE), col = as.name(g))
  )
# Error in n() : This function should not be called directly

次のように解決できます。

df %>%
  group_by_(g) %>%
  summarise_(
    n = "n()",
    sum = interp(~sum(col, na.rm = TRUE), col = as.name(g))
  )
# A tibble: 3 × 3
# group     n   sum
# <dbl> <int> <dbl>
# 1     1     1     1
# 2     2     2     4
# 3     3     3     9

0

言及されたブログに従ってコードを実行し、その後detach( "package:plyr"、unload = TRUE)でソリューションを実行しているときに同様の問題に直面しました

ブログ:https : //www.analyticsvidhya.com/blog/2017/09/comparative-stock-analysis/

Master_Data_AutoCorrelations<-Master_Data_lags %>%
  gather(key = "lag", value = "lag_value", -c(Stock,Date, Close)) %>%
  mutate(lag = str_sub(lag, start = 5) %>% as.numeric) %>%
  group_by(Stock, lag) %>%
  summarize(
    cor = cor(x = Close, y = lag_value, use = "pairwise.complete.obs"),
    cutoff_upper = 2/(n())^0.5,
    cutoff_lower = -2/(n())^0.5
  )

デタッチを実行した後、上記のコードが再実行されたとき、それは正常に機能しましたが、以下のように警告メッセージが表示されました.plyrがアンロードされたかどうかはわかりません。

警告メッセージ:「plyr」名前空間をアンロードできません:名前空間「plyr」は「reshape2」、「scales」、「broom」、「ggplot2」によってインポートされるため、アンロードできません


0

私にとっての解決策は、detach()その機能をパッケージで利用した機能でした


「その機能ダウンパッケージを利用した」とはどういう意味ですか?
匿名の臆病者

1
パッケージをダウンするために関数detach()を使用して申し訳ありませんが、パッケージdplyrとknitrの間に競合があり、次にパッケージをデタッチするために関数を使用しますdetach( "package:knitr"、unload = TRUE)
camilo lopez
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.