我正在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
)
感谢您的帮助!
答案 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()
)的列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
它不会显式调用仅数字列,但是我在多个数据集上进行了测试,并且不会影响非数字列。