将data.frame中的所有列转换为字符

m1m5dgzv  于 2023-04-03  发布在  其他
关注(0)|答案(6)|浏览(177)

考虑一个具有混合数据类型的data.frame。
为了一个奇怪的目的,用户需要将所有列转换为字符。如何最好地完成?一个tidyverse尝试解决方案是这样的:

map(mtcars,as.character) %>% map_df(as.list) %>% View()
c2<-map(mtcars,as.character) %>% map_df(as.list)

当我调用str(c2)时,它应该说一个包含所有字符的tibble或data.frame。
另一个选项是为write.csv()write_csv()设置一些参数,以便在结果文件输出中实现相同的功能。

izkcnapc

izkcnapc1#

2019 -03-01 - 01
从dplyr 1.0.0开始,_all()函数变体被取代。新的方法是使用新的across()函数。

library(dplyr)
mtcars %>%
  mutate(across(everything(), as.character))

使用across(),我们选择要使用tidyselect helpers修改的列集(这里我们使用everything()选择所有列),然后指定要应用于每个选定列的函数。在本例中,即as.character()

原答复:

也可以使用dplyr::mutate_all

library(dplyr)
mtcars %>%
  mutate_all(as.character)
7y4bm7vi

7y4bm7vi2#

以R为基数:

x[] <- lapply(x, as.character)

这会将列转换为字符类,保留data.frame的属性。调用data.frame()会导致它们丢失。

**使用dplyr进行属性保存:**属性似乎在dplyr::mutate(across(everything(), as.character))中被保存,之前被dplyr::mutate_all销毁。
示例

x <- mtcars
attr(x, "example") <- "1"

在下面的第二种情况下,保留example属性:

# Destroys attributes

data.frame(lapply(x, as.character)) %>%
  attributes()

# Preserves attributes

x[] <- lapply(x, as.character)
attributes(x)
dwbf0jvd

dwbf0jvd3#

这可能有效,但不确定是否是最好的。

df = data.frame(lapply(mtcars, as.character))
str(df)
fgw7neuy

fgw7neuy4#

使用data.table的最有效方法-

data.table::setDT(mtcars)
mtcars[, (colnames(mtcars)) := lapply(.SD, as.character), .SDcols = colnames(mtcars)]

**注意:**可以将data table中的几列转换为所需的列类型。

如果我们想将所有列转换为字符,那么我们也可以这样做-

to_col_type <- function(col_names,type){
            get(paste0("as.", type))(dt[[col_names]])
            }
mtcars<- rbindlist(list(Map(to_col_type ,colnames(mtcars),"character")))
1tuwyuhd

1tuwyuhd5#

已接受答案中的mutate_all被取代。
您可以将mutate()函数与across()一起使用:

library(dplyr)

mtcars %>% 
  mutate(across(everything(), as.character))
b5buobof

b5buobof6#

另一个选择是使用purrr包中的map_df函数,如下所示:

library(purrr)
map_df(mtcars, as.character)
#> # A tibble: 32 × 11
#>    mpg   cyl   disp  hp    drat  wt    qsec  vs    am    gear  carb 
#>    <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#>  1 21    6     160   110   3.9   2.62  16.46 0     1     4     4    
#>  2 21    6     160   110   3.9   2.875 17.02 0     1     4     4    
#>  3 22.8  4     108   93    3.85  2.32  18.61 1     1     4     1    
#>  4 21.4  6     258   110   3.08  3.215 19.44 1     0     3     1    
#>  5 18.7  8     360   175   3.15  3.44  17.02 0     0     3     2    
#>  6 18.1  6     225   105   2.76  3.46  20.22 1     0     3     1    
#>  7 14.3  8     360   245   3.21  3.57  15.84 0     0     3     4    
#>  8 24.4  4     146.7 62    3.69  3.19  20    1     0     4     2    
#>  9 22.8  4     140.8 95    3.92  3.15  22.9  1     0     4     2    
#> 10 19.2  6     167.6 123   3.92  3.44  18.3  1     0     4     4    
#> # … with 22 more rows

创建于2023-04-02使用reprex v2.0.2
如果您希望输出为data.frame,则可以将as.data.frame添加到管道中。

相关问题