将round函数应用于数据框中的每个元素

时间:2017-01-07 05:02:44

标签: r loops

假设我在R中有一个像这样的数据框

x = c(2, 3.432, 5)
y = c(4.5345, NA, "text")
z = c(8.13451, 3.12451, 6.12341)
A = data.frame(x, y, z)

如何将round函数应用于数据框的相应元素? 基本上我想:

  • 检查元素是否为数字
  • 如果没有,请不做任何更改
  • 如果是数字,则将其四舍五入到小数点后三位

我已经在很多地方读到过循环在R中不是一个好主意。尝试像

这样的行
A$y[is.numeric(A$y)] <- round(A$y, digits = 3)

不起作用

2 个答案:

答案 0 :(得分:1)

我们可以尝试lapply

A[] <- lapply(A, function(x) if(is.numeric(x)) round(x, 3) else x)

如果我们需要更改character/factor类列中的数字元素的格式

A[] <- lapply(A, function(x) {
           x1 <- type.convert(as.character(x), as.is=TRUE)
    ifelse(grepl("^[0-9.]+$", x1), round(as.numeric(x1), 3), x1)})

答案 1 :(得分:1)

您对循环有正确的想法。正如@jennybryan所说:“当然,有人必须编写循环。不必一定是您。”

如@akrun建议的那样,在ifelse上使用lapply是一种方法。 使用dplyr在数据帧上工作是另一种方式,并且是具有一致语法并且名称具有描述性(更冗长但可以说值得)的程序包和函数“ tidyverse”的一部分。

按照您的问题要求进行操作

x = c(2, 3.432, 5)
y = c(4.5345, NA, "text")
z = c(8.13451, 3.12451, 6.12341)
A = data.frame(x, y, z)
library(dplyr)
mutate(A, across(where(is.numeric), round, 3))
#>       x      y     z
#> 1 2.000 4.5345 8.135
#> 2 3.432   <NA> 3.125
#> 3 5.000   text 6.123

# can also be written as
# A %>% mutate(across(where(is.numeric), round, 3))

reprex package(v0.3.0)于2020-10-29创建