【问题标题】:pivot_longer: values_ptypes: can't convert <integer> to <character>pivot_longer:values_ptypes:无法将 <integer> 转换为 <character>
【发布时间】:2023-04-08 07:58:01
【问题描述】:

这个问题和这个问题有关dplyr median by group

并且已经在这里回答了:pivot_longer with multiple classes causes error ("No common type")

现在我知道我们应该使用values_transform 而不是values_ptypes

我想知道这是什么原因? values_ptypes 不起作用而 values_transform 现在起作用的更深层次的原因:

这是导致我遇到此问题的上述示例:

数据框:

df1 <- data.frame(
  Type1 = c("A","A","A", "AB", "AB"),
  Type2 = c(1L,2L,2L, 1L, 1L),
  Value = c(1L, 2L, 1L, NA, NA), 
  Median = c(1L, 1.5, 1.5, NA, NA))

  Type1 Type2 Value Median
1     A     1     1    1.0
2     A     2     2    1.5
3     A     2     1    1.5
4    AB     1    NA     NA
5    AB     1    NA     NA

我想 pivot_longer 使用 values_ptypes 这样的参数:不起作用!

library(dplyr)
library(tidyr)
 df1 %>% 
   pivot_longer(
     cols = contains("Type"),
     names_to = "key",
     values_to = "val", 
     values_ptypes = list(val = 'character')
     )
Error: Can't convert <integer> to <character>.
Run `rlang::last_error()` to see where the error occurred.

这应该可以组合Type1Type2,但它不起作用。

我想知道为什么在这种情况下我不能强制类型转换。

【问题讨论】:

  • 相关:pivot_longer with multiple classes causes error ("No common type")。从票数最高的接受答案中:values_ptypes 生成错误; "因此我需要使用values_transform 参数"
  • 非常感谢亨利克。 akrun 在他对这个问题的回答中现在解决了为什么以及如何解决。
  • @TarJae “为什么”是因为您使用了错误的参数,如链接答案中所述。
  • 是的,你是对的 Henrik。我不想过分强调它,但请考虑接受的答案使用values_ptypes 并且它有效;一年后,最佳答案指出,现在values_transform 将用于猜测 cmets 中的“为什么”。这不足以回答“我的原因”。无论如何,我真的很感谢讨论。我很确定我会永远记住values_transform! :-)

标签: r type-conversion pivot tidyr


【解决方案1】:

pivot_longer 需要重新调整列的形状以具有相同的类型。这里的“Type1”和“Type2”在class 中是不同的。通过在values_transform 中转换为character 将其更改为单个类。根据?pivot_longer

names_ptypes, values_ptypes - 列名-原型对的列表。原型(或简称 ptype)是一个长度为零的向量(如 integer() 或 numeric()),它定义了向量的类型、类和属性。如果您想确认创建的列是您期望的类型,请使用这些参数。请注意,如果您想更改(而不是确认)特定列的类型,则应使用 names_transform 或 values_transform

library(dplyr)
library(tidyr)
df1 %>% 
   pivot_longer(
     cols = contains("Type"),
     names_to = "key",
     values_to = "val", 
     values_transform = list(val = as.character))

-输出

# A tibble: 10 × 4
   Value Median key   val  
   <int>  <dbl> <chr> <chr>
 1     1    1   Type1 A    
 2     1    1   Type2 1    
 3     2    1.5 Type1 A    
 4     2    1.5 Type2 2    
 5     1    1.5 Type1 A    
 6     1    1.5 Type2 2    
 7    NA   NA   Type1 AB   
 8    NA   NA   Type2 1    
 9    NA   NA   Type1 AB   
10    NA   NA   Type2 1    

pivot_longer 调用 pivot_longer_spec 并在函数内下面的行生成错误

Browse[2]> 
debug: out <- vec_c(!!!val_cols, .ptype = val_type)
Browse[2]> 
Error: Can't convert <integer> to <character>.
Run `rlang::last_error()` to see where the error occurred.

【讨论】:

  • @TarJae 我更新了帖子
  • @TarJae 错误来自pivot_longer_spec。尝试debugonce(pivot_longer_spec) 并运行您的代码
  • 哦,这是了不起的阿克伦大师。你又给我大脑的黑暗部分带来了更多的光明!
猜你喜欢
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2014-04-30
  • 2012-06-18
  • 2013-12-27
相关资源
最近更新 更多