一次性将多列更改为字符型

3
我希望在我的数据框上使用pivot_longer,但并非所有列都是as.character格式,我有10多个需要更改的列,有人知道如何使用一个参数来完成此操作,以免我为所有年份编写重复的代码吗?
我的数据框如下:
fisheries_df
`Series Name`  `Country Name` `1997` `1998` `1999` `2000` `2001` `2002` `2003` `2004` `2005` `2006` `2007` `2008` `2009` `2010` `2011` `2012`
 1 Total fisheri… Albania        1110.8 2807.5 3057.9 3635   3597.2 4516.8 4274.6 6118.5 6473   7.71e3 7.51e3 7.36e3 8.13e3 7.85e3 7.35e3 1.23e4
 2 Total fisheri… Algeria        9190792620  102649 11351134082 13480141376 11405126621.46e5 1.48e5 1.42e5 1.30e5 9.52e4 1.04e5 1.08e5
 3 Total fisheri… Cyprus         25788  20482  41060  70223  56606  142941 49561  82269  64933  3.35e4 5.65e3 5.40e3 5.11e3 5.55e3 5.85e3 5.66e3

以下是我用来对数据框进行透视的代码和错误信息,假设字符问题是我的问题所在:

fisheries_longer = pivot_longer(fisheries_df, c(3:26), c('year')) 

Error in `stop_vctrs()`:
! Can't combine `1997` <character> and `2006` <double>.
Run `rlang::last_error()` to see where the error occurred.
2个回答

3
尝试这个。它使用@akruns的values_transform(),但是使用列表:在这里看到:pivot_longer: values_ptypes: can't convert <integer> to <character>
library(dplyr)
library(tidyr)
df %>% 
  pivot_longer(
    cols = -c(1:3),
    names_to = "key",
    values_to = "val", 
    values_transform = list(val = as.character))

   X.Series Name. X.Country key     val    
      <int> <chr> <chr>     <chr>   <chr>  
 1        1 Total fisheri   Name..1 Albania
 2        1 Total fisheri   X.1997. 1110.8 
 3        1 Total fisheri   X.1998. 2807.5 
 4        1 Total fisheri   X.1999. 3057.9 
 5        1 Total fisheri   X.2000. 3635   
 6        1 Total fisheri   X.2001. 3597.2 
 7        1 Total fisheri   X.2002. 4516.8 
 8        1 Total fisheri   X.2003. 4274.6 
 9        1 Total fisheri   X.2004. 6118.5 
10        1 Total fisheri   X.2005. 6473   
# ... with 24 more rows
# i Use `print(n = ...)` to see more rows

df <- structure(list(X.Series = 1:2, Name. = c("Total", "Total"), X.Country = c("fisheri", 
"fisheri"), Name..1 = c("Albania", "Algeria"), X.1997. = c(1110.8, 
91907), X.1998. = c(2807.5, 92620), X.1999. = c(3057.9, 102649
), X.2000. = c(3635L, 11351L), X.2001. = c(3597.2, 134082), X.2002. = c(4516.8, 
13480), X.2003. = c(4274.6, 141376), X.2004. = c(6118.5, 11405
), X.2005. = c(6473L, 12662L), X.2006. = c(7710, 146000), X.2007. = c(7510, 
148000), X.2008. = c(7360, 142000), X.2009. = c(8130, 130000), 
    X.2010. = c(7850, 95200), X.2011. = c(7350, 104000), X.2012. = c(12300, 
    108000)), class = "data.frame", row.names = c(NA, -2L))

2

有可能单个或多个列属于字符类。我们可以使用values_transform将其转换为字符类型(作为字符),然后根据需要进行修改。

library(tidyr)
pivot_longer(fisheries_df, c(3:26), 'year', values_transform = as.character) 

或者将其更改为as.numeric - 如果存在非数字元素,则将其转换为NA
pivot_longer(fisheries_df, c(3:26), 'year', values_transform = as.numeric)

尽管这很有道理(理论上应该有效),但我的代码仍然给我相同的错误代码; Error instop_vctrs(): ! 无法组合1997<character>和2006<double>。 运行rlang::last_error()`以查看错误发生的位置。 - Joe
1
@Joe 可能是包的版本差异,因为我在虚拟数据上测试过,一切正常。 - akrun
1
啊,好的,最终我也让我的工作了。谢谢你的帮助。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接