我有以下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发布于 2016-03-23 16:55:34
使用data.table,我们将“data.frame”转换为“data.table”(setDT(df1)),按“名称”分组,在na.rm=FALSE的目的地方向上执行na.locf,然后在反向模式(fromLast=TRUE)中再次执行该操作,并将输出分配(:=)回同一列。
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发布于 2016-03-23 17:12:04
您可以使用dplyr包来完成这个任务:
library(dplyr)
dat %>%
group_by(name) %>%
mutate(destination = destination[which(!is.na(destination))][1])这将使用每个名称的目的地的第一个非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 YORKhttps://stackoverflow.com/questions/36184188
复制相似问题