R,如何仅替换数据框的数值?

时间:2018-07-28 15:55:05

标签: r dataframe

我正在Windows 10上使用R 3.4.3。我有一个由数值和字符组成的数据框。 我只想替换数字值,但是当我这样做时,字符也会更改并被替换。

如何编辑功能以使其仅影响数字值而不影响字符?

这是我的函数的代码段:

dataframeChange <- function(dFrame){
  thresholdVal <- 20
  dFrame[dFrame >= thresholdVal] <- -1
  return(dFrame)
  }

这是一个数据框示例:

example_df <- data.frame(
   myNums = c (1:5), 
   myChars = c("A","B","C","D","E"),
   stringsAsFactors = FALSE
 )

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

蒂姆(Tim)的评论是,您应该知道数字列的位置,我们可以使用ind <- sapply(dFrame, is.numeric)来找到它们

dataframeChange <- function(dFrame){
                    #browser()
                    thresholdVal <- 20
                    ind <- sapply(dFrame, is.numeric)
                    dFrame[(dFrame[,ind] >= thresholdVal),ind] <- -1
                    #dFrame[dFrame >= thresholdVal] <- -1
                    return(dFrame)
                  }

答案 1 :(得分:1)

使用mutate_if中的dplyr

library(dplyr)

example_df %>% mutate_if(is.numeric, funs(if_else(. >= thresh, repl, .)))

  myNums myChars
1     10       A
2     -1       B
3     -1       C
4      5       D
5     -1       E

说明:

  • mutate函数家族用于变量分配或更新。
  • mutate_if函数(在funs()中指定)仅适用于满足第一个参数(在这种情况下为is.numeric())的列
  • 更新功能是基于OP规则的简单if_else子句。

数据:

thresh <- 20
repl <- -1.0

example_df <- data.frame(
   myNums = c(10,20,30,5,70), 
   myChars = c("A","B","C","D","E"),
   stringsAsFactors = FALSE
 ) 

example_df
  myNums myChars
1     10       A
2     20       B
3     30       C
4      5       D
5     70       E

答案 2 :(得分:0)

使用data.table,我们可以避免显式循环并且速度更快。在这里,我将阈值设置为2:

# set to data table
setDT(example_df)

# get numeric columns
num_cols <- names(example_df)[sapply(example_df, is.numeric)]

# loop over all columns at once
example_df[,(num_cols) := lapply(.SD, function(x) ifelse(x>2,-1, x)), .SDcols=num_cols]

print(example_df)

   myNums myChars
1:      1       A
2:      2       B
3:     -1       C
4:     -1       D
5:     -1       E

答案 3 :(得分:0)

另一个data.table解决方案。

library(data.table)

dataframeChange <- function(dFrame){
    setDT(dFrame)
    for(j in seq_along(dFrame)){
       set(dFrame, i= which(dFrame[[j]] < 20), j = j, value = -1)
    }
}

dataframeChange_dt(example_df)

example_df
#    myNums myChars
# 1:     -1       A
# 2:     20       B
# 3:     30       C
# 4:     -1       D
# 5:     70       E

它不会显式调用仅数字列,但是我在多个数据集上进行了测试,并且不会影响非数字列。