I am running pivot_longer on multiple columns (i.e. two character columns and one numeric). I am encountering an error related to the class mismatch.
I have investigated the documentation for any "force" options and did not see any arguments within pivot_longer to specify the class to use -- or to allow the function auto-detect the most general class.
Are there any parameters within pivot_longer to avoid this error? Or do you need to convert the columns to a single class before running 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")
Run Code Online (Sandbox Code Playgroud)
Kor*_*ray 17
当使用values_ptypes参数时,错误现在以不同的形式再次出现。
library(tidyverse)
small_diamonds <- diamonds %>%
select(cut, color, price) %>%
mutate(row_num = row_number())
small_diamonds %>%
pivot_longer( - row_num,
names_to = "key",
values_to = "val",
values_ptypes = list(val = 'character'))
#> Error: Can't convert <integer> to <character>.
Run Code Online (Sandbox Code Playgroud)
因此我需要使用values_transform参数来获得所需的结果。
library(tidyverse)
small_diamonds <- diamonds %>%
select(cut, color, price) %>%
mutate(row_num = row_number())
small_diamonds %>%
pivot_longer( - row_num,
names_to = "key",
values_to = "val",
values_transform = list(val = as.character))
#> # A tibble: 161,820 x 3
#> row_num key val
#> <int> <chr> <chr>
#> 1 1 cut Ideal
#> 2 1 color E
#> 3 1 price 326
#> 4 2 cut Premium
#> 5 2 color E
#> 6 2 price 326
#> 7 3 cut Good
#> 8 3 color E
#> 9 3 price 327
#> 10 4 cut Premium
#> # ... with 161,810 more rows
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v0.3.0)于 2020 年 8 月 25 日创建
使用您的示例,您可以使用 str() 看到您将两个向量编码为因子,两个向量编码为整数。pivot_longer 要求所有向量的类型相同,并抛出您报告的错误。
library(tidyverse)
small_diamonds <- diamonds %>%
select(cut, color, price) %>%
mutate(row_num = row_number())
str(small_diamonds)
Run Code Online (Sandbox Code Playgroud)
一种解决方案是使用 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")
Run Code Online (Sandbox Code Playgroud)
We can specify the values_ptype in this case (as the value columns differ in types)
library(ggplot2)
library(tidyr)
library(dplyr)
small_diamonds %>%
pivot_longer( - row_num,
names_to = "key",
values_to = "val", values_ptypes = list(val = 'character'))
# A tibble: 161,820 x 3
# row_num key val
# <int> <chr> <chr>
# 1 1 cut Ideal
# 2 1 color E
# 3 1 price 326
# 4 2 cut Premium
# 5 2 color E
# 6 2 price 326
# 7 3 cut Good
# 8 3 color E
# 9 3 price 327
#10 4 cut Premium
# … with 161,810 more rows
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |