我正在尝试仅Address
数字列,如果PersonAddress
包含数字和非数字数据列的混合。 (最初,我想知道是否有scale()
语句显示data.frame
是否包含非数字数据?)
请注意,我希望保留原始if
个变量,并且只将新的data.frame
d变量与后缀data.frame
添加到原始scale
。
我尝试了以下。但看起来它也填充了下面示例中的非数字列".s"
?
data.frame
答案 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