替换R中缺少的值

替换R中缺少的值,r,na,R,Na,我必须用ID将缺少的值替换为最大值(value)。在R中该怎么做 ID Value 1 NA 5 15 8 16 6 8 7 65 8 NA 5 25 1 62 6 14 7 NA 9 11 8 12 9 36 1 26 4 13 我将首先使用对aggregate()的调用预计算最大值,并预计算data.frame的哪些行具有NA值。然后,您可以将ID匹配到聚合表中,以提取

我必须用ID将缺少的值替换为最大值(value)。在R中该怎么做

ID Value
 1    NA
 5    15
 8    16
 6     8
 7    65
 8    NA
 5    25
 1    62
 6    14
 7    NA
 9    11
 8    12
 9    36
 1    26
 4    13

我将首先使用对
aggregate()
的调用预计算最大值,并预计算data.frame的哪些行具有NA值。然后,您可以将ID匹配到聚合表中,以提取相应的最大值

maxes <- aggregate(Value~ID,df,max,na.rm=T);
nas <- which(is.na(df$Value));
df$Value[nas] <- maxes$Value[match(df$ID[nas],maxes$ID)];
df;
##    ID Value
## 1   1    62
## 2   5    15
## 3   8    16
## 4   6     8
## 5   7    65
## 6   8    16
## 7   5    25
## 8   1    62
## 9   6    14
## 10  7    65
## 11  9    11
## 12  8    12
## 13  9    36
## 14  1    26
## 15  4    13

数据

df <- data.frame(ID=c(1L,5L,8L,6L,7L,8L,5L,1L,6L,7L,9L,8L,9L,1L,4L),Value=c(NA,15L,16L,8L,
65L,NA,25L,62L,14L,NA,11L,12L,36L,26L,13L));

##小规模(OP的示例输入)

df我将首先通过调用
aggregate()
预计算最大值,并预计算data.frame中哪些行具有NA值。然后,您可以将ID匹配到聚合表中,以提取相应的最大值

maxes <- aggregate(Value~ID,df,max,na.rm=T);
nas <- which(is.na(df$Value));
df$Value[nas] <- maxes$Value[match(df$ID[nas],maxes$ID)];
df;
##    ID Value
## 1   1    62
## 2   5    15
## 3   8    16
## 4   6     8
## 5   7    65
## 6   8    16
## 7   5    25
## 8   1    62
## 9   6    14
## 10  7    65
## 11  9    11
## 12  8    12
## 13  9    36
## 14  1    26
## 15  4    13

数据

df <- data.frame(ID=c(1L,5L,8L,6L,7L,8L,5L,1L,6L,7L,9L,8L,9L,1L,4L),Value=c(NA,15L,16L,8L,
65L,NA,25L,62L,14L,NA,11L,12L,36L,26L,13L));

##小规模(OP的示例输入)

df一个使用
数据表的简单快速的解决方案。感谢@bgoldst提供包含
na.rm=T
的提示

library(data.table)

setDT(df)[ , Value := ifelse( is.na(Value), max(Value, na.rm=T), Value), by = ID]

使用
data.table
的简单快速解决方案。感谢@bgoldst提供包含
na.rm=T
的提示

library(data.table)

setDT(df)[ , Value := ifelse( is.na(Value), max(Value, na.rm=T), Value), by = ID]

我们可以使用
na.aggregate
data.table

library(data.table)
library(zoo)   
setDT(df)[, Value := na.aggregate(Value, FUN = max) , by = ID]
df
#    ID Value
# 1:  1    62
# 2:  5    15
# 3:  8    16
# 4:  6     8
# 5:  7    65
# 6:  8    16
# 7:  5    25
# 8:  1    62
# 9:  6    14
#10:  7    65
#11:  9    11
#12:  8    12
#13:  9    36
#14:  1    26
#15:  4    13

我们可以使用
na.aggregate
data.table

library(data.table)
library(zoo)   
setDT(df)[, Value := na.aggregate(Value, FUN = max) , by = ID]
df
#    ID Value
# 1:  1    62
# 2:  5    15
# 3:  8    16
# 4:  6     8
# 5:  7    65
# 6:  8    16
# 7:  5    25
# 8:  1    62
# 9:  6    14
#10:  7    65
#11:  9    11
#12:  8    12
#13:  9    36
#14:  1    26
#15:  4    13

请参阅以下关于分组的帖子:,欢迎使用堆栈溢出!请阅读相关信息以及如何给出建议。这将使其他人更容易帮助你。可能的重复请参阅以下关于分组的帖子:,欢迎使用堆栈溢出!请阅读相关信息以及如何给出建议。这将使其他人更容易帮助你。可能的重复你知道为什么下面的代码不起作用吗<代码>库(data.table);setDT(df)[,Value:=ifelse(is.na(Value),max(Value),by=ID]
@rafa.pereira您必须将
na.rm=T
参数添加到
max()
调用中,否则组中的任何na都会导致
max()
的返回值为na。噢!当然再次感谢你。我已经发布了一个asnwer给你评分。请注意,基准测试不需要copy()函数。它稍微扭曲了比较的结果。copy()大约需要3微秒。不使用管道可以使dplyr解决方案更快一些
mutate(groupby(df,ID),Value=ifelse(is.na(Value),max(Value,na.rm=TRUE),Value))
使我的速度从863微秒提高到729微秒。你知道为什么下面的代码不起作用吗<代码>库(data.table);setDT(df)[,Value:=ifelse(is.na(Value),max(Value),by=ID]
@rafa.pereira您必须将
na.rm=T
参数添加到
max()
调用中,否则组中的任何na都会导致
max()
的返回值为na。噢!当然再次感谢你。我已经发布了一个asnwer给你评分。请注意,基准测试不需要copy()函数。它稍微扭曲了比较的结果。copy()大约需要3微秒。不使用管道可以使dplyr解决方案更快一些
mutate(group_by(df,ID),Value=ifelse(is.na(Value),max(Value,na.rm=TRUE),Value))
将我的速度从863微秒提高到729微秒。感谢@Thierry提供此解决方案。。。我总是喜欢使用管道函数进行数据清理和准备。。。当我读到这个问题时,我的脑海里浮现出与你的答案完全相同的东西…谢谢@Thierry的这个解决方案。。。我总是喜欢使用管道函数进行数据清理和准备。。。当我读到这个问题时,我的脑海里浮现出与你的答案完全相同的东西。。。
library(data.table)
library(zoo)   
setDT(df)[, Value := na.aggregate(Value, FUN = max) , by = ID]
df
#    ID Value
# 1:  1    62
# 2:  5    15
# 3:  8    16
# 4:  6     8
# 5:  7    65
# 6:  8    16
# 7:  5    25
# 8:  1    62
# 9:  6    14
#10:  7    65
#11:  9    11
#12:  8    12
#13:  9    36
#14:  1    26
#15:  4    13