操作data.frame,同时保留Base R中的原始内容

时间:2018-03-19 23:56:22

标签: r function dataframe

我正在尝试仅Address数字列,如果PersonAddress包含数字和非数字数据列的混合。 (最初,我想知道是否有scale()语句显示data.frame是否包含非数字数据?)

请注意,我希望保留原始if个变量,并且只将新的data.frame d变量与后缀data.frame添加到原始scale

我尝试了以下。但看起来它也填充了下面示例中的非数字列".s"

data.frame

3 个答案:

答案 0 :(得分:3)

RE:关于如何测试数据框是否包含任何非数字列的问题,您有几种方法可以执行此操作。这是一个:

all(sapply(iris, class) == "numeric")
# [1] FALSE

您可以在if语句中将其用作测试。当scale()能够产生结果时,它应该是正确的。

或者,你可以try犯罪colMeans,但最终会变得更复杂。

编辑:由于OP接受了这个作为答案,我将添加@Frank的评论,回答第一部分:

  

f = function(d) {ind <- sapply(d, is.numeric); d[paste0(names(d)[ind], ".s")] <- lapply(d[ind], scale); d} - 弗兰克

答案 1 :(得分:2)

使用dplyr,您可以:

library(dplyr)
iris %>% 
    mutate_if(is.numeric, funs(s = scale))

这将创建带有后缀_s的缩放列(据我所知,无法将其更改为.s,尽管您可以随时执行其他重命名步骤。)

答案 2 :(得分:2)

替代解决方案:

data <- data.frame(iris, scale(Filter(is.numeric, setNames(iris, paste0(names(iris), ".s")))))

返回:

> head(data)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length.s Sepal.Width.s Petal.Length.s Petal.Width.s
1          5.1         3.5          1.4         0.2  setosa     -0.8976739    1.01560199      -1.335752     -1.311052
2          4.9         3.0          1.4         0.2  setosa     -1.1392005   -0.13153881      -1.335752     -1.311052
3          4.7         3.2          1.3         0.2  setosa     -1.3807271    0.32731751      -1.392399     -1.311052
4          4.6         3.1          1.5         0.2  setosa     -1.5014904    0.09788935      -1.279104     -1.311052
5          5.0         3.6          1.4         0.2  setosa     -1.0184372    1.24503015      -1.335752     -1.311052
6          5.4         3.9          1.7         0.4  setosa     -0.5353840    1.93331463      -1.165809     -1.048667