在lapply之后收集数据帧的行为有所不同

时间:2017-06-26 19:02:51

标签: r dplyr lapply

当我应用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}}

有什么想法吗?

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)