我有一个带有一些数字,一些整数和一些因子列的数据框。我正在尝试将数据框转换为仅将数字列平方,但是this thread中的解决方案在此用例中不起作用:
square <- function(x){return(x^2)}
Numerics <- function(df){return(Filter(is.numeric,df))}
SquareD <- function(df){
Numerics(df) <- apply(Numerics(df),2,square)
return(df)
}
现在,在尝试运行SquareD(iris)
时,出现了'数字错误(df)
我该如何使用它?有点像
iris[sapply(df,is.numeric)] <- apply(iris[sapply(iris,is.numeric)],2,square)
确实有效,但是又长又笨重。我宁愿短一些(包装在一个函数中)也可以重复。但是
Numerics <- function(df){return(df[sapply(df,is.numeric)])}
SquareD <- function(df){
Numerics(df) <- apply(Numerics(df),2,square)
return(df)
}
仍然不起作用。不使用新定义函数的东西,但仍然有点短,例如
SquareD <- function(df){
Filter(is.numeric,df) <- apply(Filter(is.numeric,df),2,square)
return(df)
}
也不起作用。 (或例如用dplyr::select_if(df,is.numeric)
代替上面的Filter(is.numeric,df)
)
注意:我要按照上面的说明进行操作,即使用一种既可用于替换又可用于选择的方法(因此,为什么我尝试使用该线程中建议的选择方法),而且该方法简短而无需重写冗长的代码(例如sapply)。例如,我可能想用虹膜数值列的平方值替换ANOTHER数据集的数值列。那种应用。
我知道可以单独使用dplyr :: mutate_if进行替换,但我不希望这样。而是希望了解为什么选择方法在这里不起作用,并且可以对其进行调整。我也想像上面那样在一行中执行此操作(或使用最终在一行中执行的预定义功能)。最后,请不要使用dplyr的任何库。
如果要在基数R中执行此操作,则可以使用:
SquareD <- function(df){
cols <- sapply(df, is.numeric)
df[cols] <- lapply(df[cols], square)
return(df)
}
SquareD(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 26 12.2 2.0 0.04 setosa
#2 24 9.0 2.0 0.04 setosa
#3 22 10.2 1.7 0.04 setosa
#4 21 9.6 2.2 0.04 setosa
#5 25 13.0 2.0 0.04 setosa
#6 29 15.2 2.9 0.16 setosa
#....
在dplyr
中,
library(dplyr)
iris %>% mutate(across(where(is.numeric), square))
或在较早的版本中:
iris %>% mutate_if(is.numeric, square)
应用于数据框:
iris_sqrd <- data.frame(Map(function(x) x**2, iris[,sapply(iris, is.numeric)]))
作为功能:
# Function:
square_df <- function(df){data.frame(Map(function(x) x**2, df[,sapply(df, is.numeric)]))}
# Application:
iris_sqrd <- square_df(iris)