我有一个数据框,其中包含一些数字列、一些整数列和一些因子列。我正在尝试将数据框转换为仅对数字列进行平方,但解决方案这个线程 https://stackoverflow.com/questions/5863097/selecting-only-numeric-columns-from-a-data-frame在此用例中不起作用:
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)
,我得到“Numerics(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)
above)
注意:我想按照上面所示执行此操作,即使用一种适用于替换和选择的方法(因此我尝试使用该线程中建议的选择方法)并且很短,而无需重写有些冗长的代码(就像 sapply 一样)。例如,我可能想用 iris 数值列的平方值替换另一个数据集的数值列。那样的应用。
我知道仅用于替换我可以使用 dplyr::mutate_if 但我不想要那样。而是希望了解为什么选择方法在这里不起作用并且可以对其进行调整。我也想在一行中完成它(或使用最终在一行中执行的预定义函数),如上所述。最后,除了 dplyr 之外,没有任何库。