【问题标题】:Problem with str_replace in many columns and for许多列中的 str_replace 问题和
【发布时间】:2020-03-12 17:14:49
【问题描述】:

我是 R 的菜鸟。

我正在使用大约 150 行和 21 列的数据框。我想将第 5 列的第 20 列字符“-”更改为“0.00”。

我正在使用此代码,它可以单独工作:

datos$max52sem<-str_replace(datos$max52sem,"-","0.00")
datos$min52sem<-str_replace(datos$min52sem,"-","0.00")

我正在尝试使用“for”从所有列中更改它,而不是写下所有变量的名称 15 次。

这就是我要写的:

mis_vars<-c("max52sem","min52sem","cierre_prev","cierre_hoy","max_hoy","min_hoy","ret_hoy","ret_sem","ret_mes","ret_año","ret_ytd","vol","upa","vla","pvla","pu")
for(x in mis_vars)
  datos$x<-str_replace(datos$x,"-","0")

“mis_vars”是我想在数据框中更改的列(变量)的名称,但我从 R 得到这个答案,但我不知道我做错了什么。

$&lt;-.data.frame(*tmp*, "x", value = character(0)) 中的错误: 替换有0行,数据有1220>

【问题讨论】:

    标签: r dataframe for-loop replace str-replace


    【解决方案1】:

    使用dplyr,我们可以使用mutate_at

    library(dplyr)
    library(stringr)
    datos <- datos %>%
                 mutate_at(vars(mis_vars), ~ str_replace(., "-", "0"))
    

    在 OP 的 for 循环中,应该是 datos[[x]] &lt;- 而不是 datos$x &lt;-,因为它将创建一个名为 'x' 的列而不是 'mis_vars' 中的变量


    或者只使用base R

    datos[mis_vars] <- lapply(datos[mis_vars], sub, pattern = "-", replacement = "0")
    

    【讨论】:

    • 非常感谢它有效!!!我将尝试使用 dplyr,但它适用于 [[x]] 而不是 datos$ 并更改 'x' 而不是 'mis_vars'。
    【解决方案2】:

    在base R中,我们可以使用lapply来改变多个列

    datos[mis_vars]  <- lapply(datos[mis_vars], function(x) sub("-", "0.00", x))
    

    【讨论】:

      猜你喜欢
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多