仅选择要替换的数字列

问题描述 投票:1回答:2

我有一个带有一些数字,一些整数和一些因子列的数据框。我正在尝试将数据框转换为仅将数字列平方,但是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 select replace
2个回答
2
投票

如果要在基数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)

0
投票

应用于数据框:

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)
© www.soinside.com 2019 - 2024. All rights reserved.