【问题标题】:Permanently convert multiple columns to numeric - dplyr将多列永久转换为数字 - dplyr
【发布时间】:2021-03-28 11:46:35
【问题描述】:

我在这里遵循dplyr-解决方案: converting multiple columns from character to numeric format in r 将多个字符列转换为数字。

代码

is_all_numeric <- function(x) 
{
  !any(is.na(suppressWarnings(as.numeric(na.omit(x))))) & is.character(x)
}
df %>%
   mutate_if(is_all_numeric,as.numeric) #%>%
   str()

完美运行。但是,如果我尝试使用

将其分配给df(即永久更改列类型)
df <- df %>%
   mutate_if(is_all_numeric,as.numeric) #%>%
   str()

df 变为 Null。因此,我想知道发生了什么以及如何使用这些代码行永久地制作数字格式?

MRE

df <- tribble(~date, ~value,
        "2017-01-01", 1,
        "2017-01-02", 2,
        "2017-01-02", 3,
        "2017-01-03", 4,
        "2017-01-03", NA,
        "2017-01-04", 6,
        "2017-01-09", 9) %>% 
  arrange(date) %>% 
  mutate(to_date=cumsum(value))

【问题讨论】:

  • 无法重现您的问题。您可以尝试新的 R 会话吗

标签: r dplyr


【解决方案1】:

改用这个——across 在 7 年前写问题中的链接时不存在:

df %>% mutate(across(.fns = type.convert))

或仅使用基础 R:

replace(df, TRUE, lapply(df, type.convert))

【讨论】:

  • 公平地说,虽然问题是旧的,但它有一个更新的across answer
  • 我只是指出这一点。 type.convert 真的是重点。
【解决方案2】:

按照 akruns 的回答,这只是为了解释你的问题是什么。

注意

df <- str(df)
df
NULL

所以你遇到的错误是你复制了一个解决方案而不了解它的每个部分。

寻找解决方案的一个好技巧是

  1. 测试并查看它是否有效
  2. 使用“帮助”查看每个部分的作用(最好是每个部分)。
  3. 试试看你能不能再做一个小例子来说明你理解它是如何工作的

在我们的例子中,您可以使用 help("mutate_if") 并立即声明 [lifecycle: Superseded],表明存在一个新的更好的实现(akruns 回答),并且通读您发现没有任何可疑之处(不返回 NULL),所以下一部分是 help("str")help("%&gt;%")。在第一个您将在 return 下看到的

str 出于效率原因,不返回任何内容。明显的副作用是输出到终端。

说明问题出在这个函数上。

【讨论】:

  • 谢谢,我确实低估了str的作用。 df&lt;- df%&gt;%mutate_if(is_all_numeric,as.numeric) 作为(被取代的)替代方案。不同之处在于此代码将字符串列保留为字符,而 G.Grothendiek 使用 across 的建议将它们转换为因子。
猜你喜欢
  • 2020-10-12
  • 1970-01-01
  • 2018-06-20
  • 2011-05-02
  • 2011-06-30
  • 2018-07-31
  • 2013-01-31
  • 2019-12-11
  • 2017-09-02
相关资源
最近更新 更多