替换R中缺少的值
我必须用ID将缺少的值替换为最大值(value)。在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
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