web-dev-qa-db-ja.com

複数のクラスを含むpivot_longerはエラーを引き起こします(「一般的なタイプはありません」)

複数の列(つまり、2つの文字列と1つの数値列)でpivot_longerを実行しています。クラスの不一致に関連するエラーが発生します。

「強制」オプションのドキュメントを調査しましたが、pivot_longer内に使用するクラスを指定したり、関数が最も一般的なクラスを自動検出できるようにするための引数はありませんでした。

このエラーを回避するためにpivot_longer内にパラメータはありますか?または、pivot_longerを実行する前に、列を単一のクラスに変換する必要がありますか?

library(dplyr)
library(tidyr)
library(ggplot2) # Just for `diamonds` dataset

small_diamonds <- diamonds %>% 
  # Select a few columns (two character, one numeric, specifically integers)
  select(cut, color, price) %>% 
  # Create a row_id
  mutate(row_num = row_number()) 

# This works with `gather`
small_diamonds %>% 
  gather(key, val, - row_num)

# This fails due to class error:
small_diamonds %>% 
  # Pivot data
  pivot_longer( - row_num, 
                names_to = "key",
                values_to = "val")

# Output
# Error: No common type for `cut` <ordered<4bd7e>> and `price` <integer>.
# Call `rlang::last_error()` to see a backtrace

# Convert columns to a single class (character) and then use `pivot_longer`. 
# Runs successfully
small_diamonds %>% 
  mutate_all(as.character) %>% 
  # Pivot data
  pivot_longer( - row_num, 
                names_to = "key",
                values_to = "val")

6

この例を使用すると、str()を使用して、因子としてエンコードされた2つのベクトルと整数として2つのベクトルがあることがわかります。 pivot_longerは、すべてのベクトルが同じタイプであることを要求し、報告したエラーをスローします。

    library(tidyverse)
    small_diamonds <- diamonds %>%
      select(cut, color, price) %>%
      mutate(row_num = row_number())

    str(small_diamonds)

1つの解決策は、mutate.ifを使用してすべてのベクトルを文字に変換し、pivot_longerコマンドを渡すことです。

    small_diamonds %>% 
      mutate_if(is.numeric,as.character, is.factor, as.character) %>% 
      pivot_longer( - row_num, 
            names_to = "key",
            values_to = "val") 
0
BMLopes