【问题标题】:Converting different columns to different formats将不同的列转换为不同的格式
【发布时间】:2018-07-05 00:31:42
【问题描述】:

我在 R 中有一个 df,我使用以下方法加载:

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

我这样做是因为我必须执行某些操作,例如剥离“$”等。

现在,我正在尝试将列转换为适当的格式,而不必单独 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(内部的第二个参数 [...]) 是单个符号,但未找到列名 'cols'。可能 您打算使用 DT[,..cols] 或 DT[,cols,with=FALSE]。这种差异到 data.frame 是经过深思熟虑的,并在 FAQ 1.1 中进行了解释。

[.data.table(data, cols) 中的错误:当 i 是 data.table(或 字符向量),必须指定要连接的列 使用 'on=' 参数(参见 ?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>)

请给点建议?

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

【问题讨论】:

  • 请 (a) 分享一个可重现的小例子。可以复制/粘贴的东西,例如dput(data[1:6, 1:11])。然后也请展示你的一些尝试。您是否希望自动检测课程?你是手工挑选数字列吗?按名称或索引?如果是这样,您能否也分享一下,这样我们就不必猜测了?
  • 您看到的错误可能是可以修复的,但是如果您不共享产生它们的代码,则很难提供帮助。
  • @Gregor 我已经添加了您要求的信息...我正在寻找一种手动分类列的通用方法...自动检测将不起作用-关键是将多个列分类为一个调用而不是手动执行每个操作。我可以按数字或按名称选择列 - 这并不重要。
  • 我看到了数据。我仍然看不到(a)您使用的代码会产生您得到的错误,或(b)任何告诉我(或可以告诉 R)您希望将哪些列设为数字的内容。我也不确定您为什么认为自动检测不起作用 - 您是否担心 R 会做太多工作?
  • @Gregor- 由于特殊字符,自动检测不起作用,这就是为什么我必须以字符形式读取数据...至于我尝试了哪些解决方案,我使用了每一个解决方案在问题中提供的链接中提供...它们都产生相同的错误

标签: r dataframe type-conversion


【解决方案1】:

我意识到这是一个您可能不再处理的较老问题,但由于这是人们在 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 更改为合适的类型。

【讨论】:

    猜你喜欢
    • 2018-06-13
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2016-04-15
    相关资源
    最近更新 更多