首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用mutate_at时group_by的计算错误

使用mutate_at时group_by的计算错误
EN

Stack Overflow用户
提问于 2017-11-17 16:24:04
回答 1查看 1.3K关注 0票数 3

mutate_at()在与group_by()一起使用时以及在将列位置的数值向量作为第一个(.vars)参数时显示了一个计算错误。

  • 使用R3.4.2和dplyr0.7.4版本时出现问题
  • 使用R3.3.2和dplyr0.5.0时工作正常
  • 如果.vars是字符向量(列名),则工作正常。

示例:

代码语言:javascript
运行
复制
# Create example dataframe
Id <- c('10_1', '10_2', '11_1', '11_2', '11_3', '12_1')
Month <- c(2, 3, 4, 6, 7, 8)
RWA <- c(0, 0, 0, 1.579, NA, 0.379)
dftest = data.frame(Id, Month, RWA)

# Define column to fill NAs
nacol = c('RWA')

# Fill NAs with last period
dftest_2 <- dftest %>%
  group_by(Id) %>%
  mutate_at(which(names(dftest) %in% nacol), 
            funs(ifelse(is.na(.),0,.)))
代码语言:javascript
运行
复制
Error in mutate_impl(.data, dots) : 
Evaluation error: object 'NA' not found.

更合理的例子说明了问题:

代码语言:javascript
运行
复制
# Create example dataframe
Id <- c('10_1', '10_2', '11_1', '11_3', '11_3', '12_1')
Month <- c(2, 3, 4, 6, 7, 8)
RWA <- c(0, 0, 0, 1.579, NA, 0.379)
dftest = data.frame(Id, Month, RWA)

# Define column to fill NAs
nacol = c('RWA')

# Fill NAs with last period
dftest_2 <- dftest %>%
  group_by(Id) %>%
  mutate_at(which(names(dftest) %in% nacol), 
            funs(na.locf(., na.rm=F)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-17 16:40:17

我们获得NA值的原因是我们从which获得的输出为3,但我们按'Id‘分组,因此之后只有2列。

代码语言:javascript
运行
复制
dftest %>%
     group_by(Id) %>% 
     mutate_at(which(names(dftest) %in% nacol)-1, funs(ifelse(is.na(.),0,.)))
# A tibble: 6 x 3
# Groups:   Id [6]
#      Id Month   RWA
#  <fctr> <dbl> <dbl>
#1   10_1     2 0.000
#2   10_2     3 0.000
#3   11_1     4 0.000
#4   11_2     6 1.579
#5   11_3     7 0.000
#6   12_1     8 0.379

这里不需要group_by是部分,因为我们正在将其他列中的NA值更改为0。

代码语言:javascript
运行
复制
dftest %>%
    mutate_at(which(names(dftest) %in% nacol), funs(ifelse(is.na(.),0,.)))

这可能是一个错误,使用基于位置的方法有时是有风险的。更好的选择是使用names

代码语言:javascript
运行
复制
dftest %>%
    group_by(Id) %>% 
    mutate_at(intersect(names(.), nacol), funs(replace(., is.na(.), 0)))

注意:在所有这些情况下,都不需要group_by

另一种选择是从replace_natidyr

代码语言:javascript
运行
复制
dftest %>%
    tidyr::replace_na(as.list(setNames(0, nacol)))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47355085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档