首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用子组中填充的值填充NA值

使用子组中填充的值填充NA值
EN

Stack Overflow用户
提问于 2016-03-23 16:53:15
回答 2查看 58关注 0票数 2

我有以下data.frame:

代码语言:javascript
复制
name  nav_status   destination
 A       5           MUMBAI
 A       0            NA
 A       1            NA
 B       5            NA
 B       0          NEW YORK
 B       1            NA

我打算使用基于name列的值填充NA值。我试过:

  1. 用最后一次观测推进技术填充NA值,但数据会发生失真。我使用了zoo包和na.locf语法: NEW <- na.locf(FINAL, fromLast = TRUE)
  2. 我还尝试创建一个单独的文件,然后使用gsub,但是它不是泛型的,每次都必须创建一个单独的文件,因为我有大量的数据。

预期结果:

代码语言:javascript
复制
name  nav_status   destination
 A       5           MUMBAI
 A       0           MUMBAI
 A       1           MUMBAI
 B       5          NEW YORK 
 B       0          NEW YORK
 B       1          NEW YORK
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-23 16:55:34

使用data.table,我们将“data.frame”转换为“data.table”(setDT(df1)),按“名称”分组,在na.rm=FALSE的目的地方向上执行na.locf,然后在反向模式(fromLast=TRUE)中再次执行该操作,并将输出分配(:=)回同一列。

代码语言:javascript
复制
library(zoo)
library(data.table)
setDT(df1)[, destination := na.locf(na.locf(destination, 
      na.rm=FALSE), fromLast=TRUE),  by = name]
df1
#   name nav_status destination
#1:    A          5      MUMBAI
#2:    A          0      MUMBAI
#3:    A          1      MUMBAI
#4:    B          5    NEW YORK
#5:    B          0    NEW YORK
#6:    B          1    NEW YORK
票数 1
EN

Stack Overflow用户

发布于 2016-03-23 17:12:04

您可以使用dplyr包来完成这个任务:

代码语言:javascript
复制
library(dplyr)
dat %>%
  group_by(name) %>%
  mutate(destination = destination[which(!is.na(destination))][1])

这将使用每个名称的目的地的第一个非NA值填充目标列。

代码语言:javascript
复制
    name nav_status destination
  (fctr)      (dbl)      (fctr)
1      A          5      MUMBAI
2      A          0      MUMBAI
3      A          1      MUMBAI
4      B          5    NEW YORK
5      B          0    NEW YORK
6      B          1    NEW YORK
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36184188

复制
相关文章

相似问题

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