web-dev-qa-db-ja.com

data.frame内のすべての列を文字に変換します

データ型が混在するdata.frameを考えます。

奇妙な目的のために、ユーザーはすべての列を文字に変換する必要があります。最善の方法は?解決策のきちんとした試みはこれです:

_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()のパラメーター設定で、結果のファイル出力で同じことを実現します。

20
userJT

dplyr::mutate_allを使用することもできます。

library(dplyr)
mtcars %>%
  mutate_all(as.character)
36
Jake Thompson

mutate_allおよびlapplyの後にdata.frameを再キャストすると、data.frameの属性が変更されます。基になるdata.frameに関連付けられているrow.names、labels、またはその他の属性を保持する必要がある場合は、次を試してください。

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

これにより、列が適切な文字クラスに変換され、data.frameの属性が保持されます。

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

以下の最後の場合のみ、example属性が保持されます。

x %>%
  mutate_all(as.character) %>%
  attributes()

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

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

入力が単一列のdata.frameである場合、x[, ]は、data.frameではなくベクトルを返します。これに対処するには、 data.frameから単一の列をdata.frameとして抽出する方法 を参照してください。

12
Sam Firke

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")))
4
Rushabh Patel

これはうまくいくかもしれませんが、それが最良かどうかはわかりません。

df = data.frame(lapply(mtcars, as.character))
str(df)
3
Sean Lin