我有以下data.frame:
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值。 我试过了:
使用上次观察结果技术填充NA
值,但数据会失真。我使用了zoo
包和na.locf
语法:
NEW <- na.locf(FINAL, fromLast = TRUE)
我还尝试创建一个单独的文件,然后使用gsub
,但它不是通用的,每次因为我有大量数据时都必须创建一个单独的文件。
预期结果:
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
答案 0 :(得分:1)
使用data.table
,我们会转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)
)按名称&#39;分组,使用na.locf
在目的地的前进方向上执行na.rm=FALSE
,然后以反向模式再次执行此操作fromLast=TRUE
1}})并将输出(:=
)分配回同一列。
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 :(得分:1)
您可以使用dplyr包执行此操作:
library(dplyr)
dat %>%
group_by(name) %>%
mutate(destination = destination[which(!is.na(destination))][1])
这将使用每个名称的第一个非NA NA值填充目标列。
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