当我应用lapply
时,我的数据集中发生了更改,而gather
(来自dplyr
)则无效。这是一个最低限度的工作示例:
employee<- c('John','Peter','Mary',"Kate")
salarypre <- c(-1,23.5,33.2,34)
salarypost <- c(51,25.2,53,24.3)
startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14','2008-3-12'))
mydata<-data.frame(employee,salarypre,salarypost,startdate)
mydata.big<-gather(mydata,feature,val,salarypre,salarypost)
View(mydata.big)
但是,让我们说-1
中的salarypre
应该被视为NA
,所有负值都应该被视为NA
。应用函数将我的数据集中的所有负值转换为mydata<-lapply(mydata,function(x) ifelse(is.numeric(x) & x<0,NA,x))
是有意义的。所以我做了:
> mydata.big<-gather(mydata,feature,val,salarypre,salarypost)
Error: is.character(x) is not TRUE
但是,现在我无法使用收集:
{{1}}
有什么想法吗?
答案 0 :(得分:2)
lapply 返回一个列表,用 data.frame 函数进行转换以进行转换,然后 gather 应按预期工作:
mydata <- data.frame(lapply(mydata, function(x) ifelse(is.numeric(x) & x < 0, NA, x)))
gather(mydata, feature, val, salarypre, salarypost)
# employee startdate feature val
# 1 1 14914 salarypre NA
# 2 4 13963 salarypre 23.5
# 3 3 13586 salarypre 33.2
# 4 2 13950 salarypre 34.0
# 5 1 14914 salarypost 51.0
# 6 4 13963 salarypost 25.2
# 7 3 13586 salarypost 53.0
# 8 2 13950 salarypost 24.3
修改:为了避免应用,我们可以将 mutate_if 与自定义函数一起使用:
myFun <- function(x){ifelse(x < 0, NA, x)}
mydata %>% mutate_if(is.numeric, myFun) %>%
gather(feature, val, salarypre, salarypost)