将不同的列转换为不同的格式

时间:2018-01-25 17:01:58

标签: r dataframe type-conversion

我在R中使用了df:

data <- fread("Data/LuminateDataExport_UTDP2_011818.csv", colClasses = 'character', stringsAsFactors = FALSE)

我这样做是因为我必须执行某些操作,例如剥离&#34; $&#34;等。

现在,我正在尝试将列转换为适当的格式,而不必单独为每个列as._ ...

当前df的结构是:

> str(data)
Classes ‘data.table’ and 'data.frame':  196879 obs. of  32 variables:
 $ city             : chr  "" "" "" "" ...
 $ company_goal     : chr  "" "" "" "" ...
 $ company_name     : chr  "" "" "" "" ...
 $ event_date       : chr  "5/14/2016" "9/26/2015" "9/12/2015" "6/3/2017" ...
 $ event_year       : chr  "FY 2016" "FY 2016" "FY 2016" "FY 2017" ...
 $ fundraising_goal : chr  "250" "200" "350" "0" ...
 $ name             : chr  "Heart Walk 2015-2016 St. Louis MO" "Heart Walk 2015-2016 Canton, OH" "Heart Walk 2015-2016 Dallas, TX" "FDA HW 2016-2017 Albany, NY WO-65355" ...
 $ participant_id   : chr  "2323216" "2273391" "2419569" "4088558" ...
 $ state            : chr  "" "OH" "TX" "" ...
 $ street           : chr  "" "" "" "" ...
 $ team_average     : chr  "176" "123" "306" "47" ...
 $ team_captain     : chr  "No" "No" "Yes" "No" ...
 $ team_count       : chr  "7" "6" "4" "46" ...
 $ team_id          : chr  "152788" "127127" "45273" "179207" ...
 $ team_member_goal : chr  "0" "0" "0" "0" ...
 $ team_name        : chr  "Team Clayton" "Cardiac Crusaders" "BIS - Team Myers" "Independent Walkers" ...
 $ team_total_gifts : chr  "1,230 " "738" "1,225 " "2,145 " ...
 $ zip              : chr  "" "" "" "" ...
 $ gifts_count      : chr  "2" "1" "2" "1" ...
 $ registration_gift: chr  "No" "No" "No" "No" ...
 $ participant_gifts: chr  "236" "218" "225" "0" ...
 $ personal_gift    : chr  "0" "0" "0" "250" ...
 $ total_gifts      : chr  "236" "218" "225" "250" ...
 $ match_code       : chr  "UX000" "UX000" "UX000" "UX000" ...
 $ tap_level        : chr  "X" "X" "X" "X" ...
 $ tap_desc         : chr  "" "" "" "" ...
 $ tap_lifed        : chr  "" "" "" "" ...
 $ medage_cy        : chr  "0" "0" "0" "0" ...
 $ divindx_cy       : chr  "0" "0" "0" "0" ...
 $ medhinc_cy       : chr  "0" "0" "0" "0" ...
 $ meddi_cy         : chr  "0" "0" "0" "0" ...
 $ mednw_cy         : chr  "0" "0" "0" "0" ...
 - attr(*, ".internal.selfref")=<externalptr> 

现在,作为第一步 - 我正在尝试转换所有数字to_numeric

我已经尝试了here找到的所有解决方案,但没有一个有效。

我一直在犯的错误是:

  

[.data.table(data ,, cols)中的错误:j(内部的第二个参数)   [...])是单个符号,但是列名称&#39; cols&#39;找不到。也许   你打算DT [,.. cols]或DT [,cols,= FALSE]。这与众不同   data.frame是经过深思熟虑的,并在FAQ 1.1中进行了解释。

  

[.data.table(数据,列)中的错误:当我是data.table(或   字符向量),必须指定要连接的列   使用&#39; on =&#39;参数(参见?data.table)或通过键入x(即排序,   并标记为已排序,请参阅?setkey)。键控连接可能会更进一步   由于x在RAM中排序,因此速度对非常大的数据有益。

这里有一些关于数据的更多信息:

> dput(data[1:6, 1:11])
structure(list(city = c("", "", "", "", "", ""), company_goal = c("", 
"", "", "", "", ""), company_name = c("", "", "", "", "", ""), 
    event_date = c("5/14/2016", "9/26/2015", "9/12/2015", "6/3/2017", 
    "5/6/2017", "10/17/2015"), event_year = c("FY 2016", "FY 2016", 
    "FY 2016", "FY 2017", "FY 2017", "FY 2016"), fundraising_goal = c("250", 
    "200", "350", "0", "0", "100"), name = c("Heart Walk 2015-2016 St. Louis MO", 
    "Heart Walk 2015-2016 Canton, OH", "Heart Walk 2015-2016 Dallas, TX", 
    "FDA HW 2016-2017 Albany, NY WO-65355", "FDA HW 2016-2017 New Haven, CT WO-66497", 
    "Heart Walk 2015-2016 Puget Sound, WA"), participant_id = c("2323216", 
    "2273391", "2419569", "4088558", "4527010", "2424207"), state = c("", 
    "OH", "TX", "", "", "WA"), street = c("", "", "", "", "", 
    ""), team_average = c("176", "123", "306", "47", "0", "97"
    )), .Names = c("city", "company_goal", "company_name", "event_date", 
"event_year", "fundraising_goal", "name", "participant_id", "state", 
"street", "team_average"), class = c("data.table", "data.frame"
), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x10200c378>)

建议吗?

(一旦我这样做,我还必须将不同的列转换为因子等)

1 个答案:

答案 0 :(得分:2)

我意识到这是一个较旧的问题,您可能不再研究,但由于这是人们在 R 中搜索同时将多列格式化为数字时出现的第一个问题,我想我会添加一个想法。

关于您问题的第一部分——如何确定哪些列是数字、哪些列是日期、哪些列是因子等——我没有很好的答案,特别是因为因子最初可以是字符或否则,但随后被指定为因子。决定转换哪些在很大程度上取决于设计师。如果没有可接受的 NA 条目,您可以使用逻辑 here 来确定哪些列应该被格式化为数字。一旦您决定了要转换的列。 . .

我猜您的第二个错误出现是因为您使用的数据表与当前的语法要求略有不同。您可以在这篇文章的后续答案之一中找到使用数据表语法更改所选列的说明:

Coerce multiple columns to factors at once

在那篇文章中,他们强制一组列进行分解;相同的过程适用于强制转换为数字。

为简单起见,您可以指定所需的列(使用数值或列名或其他方式——在您的情况下,将使用您应用于将数据分组的任何逻辑和规则以编程方式分配此值)。例如,

colsToConvert <- c(6,11,13)

colsToConvert <- c("fundraising_goal","team_average","team_count")

然后您使用 lapply 命令并使用 SDcols 子集规范:

data[, (colsToConvert) := lapply(.SD, as.numeric), .SDcols = colsToConvert]

那应该可以完成您的转换。对任意数量的数据类型重复此过程,将格式从 as.numeric 更改为任何合适的类型。