我有一个面板数据,其中包含一些缺少一些变量的值。我想用面板平均值的序列均值估算缺失的数据。我尝试使用以下代码,但我不知道如何通过考虑年份和ID或国家/地区要求r进行计算。
以下代码是为一个变量估算缺失值的尝试。 **我的目标是对所有变量执行此步骤。
my_data$V1[is.na(my_data$V1)] <- mean(my_data$V1,na.rm = TRUE)
head(my_data)
year id V1 V2
2000 AA
2001 AA
2002 AA 2 2
2003 AA 3 3
2000 BB 4 4
2001 BB
2002 BB 3 3
2003 BB
2000 CC 2 2
2001 CC 3
2002 CC 3 3
2003 CC
2000 DD 4
2001 DD 2
2002 DD
2003 DD
如何通过计算缺失值的平均值来处理缺失值?
它不一定是我在此处输入的代码,如果您有其他方法或方法,请在此处添加。
谢谢。
答案 0 :(得分:2)
这可以在软件包package dto;
import java.io.Serializable;
public class ClientDTO implements Serializable
{
private final int id;
private final String name;
private final String username;
private final String password;
public ClientDTO(int id, String name, String username, String password){
this.id = id;
this.name = name;
this.username = username;
this.password = password;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
public String getUsername(){
return username;
}
public boolean passwordMatches(String pwd){
return password.equals(pwd);
}
}
package dto;
import java.io.Serializable;
import java.util.Calendar;
import javax.inject.Named;
@Named(value = "clientOrder")
public class clientOrderDTO implements Serializable{
private final int id;
private final ClientDTO client;
private final String orderName;
private Calendar paymentDate;
public clientOrderDTO(int id, ClientDTO client, String orderName,Calendar paymentDate){
this.id = id;
this.client = client;
this.orderName = orderName;
this.paymentDate = paymentDate;
}
public int getId(){
return id;
}
public ClientDTO getClient(){
return client;
}
public String getOrderName(){
return orderName;
}
public Calendar getPaymentDate(){
return paymentDate;
}
public void setPatmentDate(Calendar paymentDate){
this.paymentDate = paymentDate;
}
}
的帮助下完成。
dplyr
答案 1 :(得分:2)
这是基本的R解决方案
my_data$V1<-ave(my_data$V1,my_data$id,FUN=function(x) ifelse(is.na(x), mean(x,na.rm=TRUE), x))
这是将其应用于所有列的方法。
for (i in 3:ncol(my_data)){
my_data[,i] <- ave(my_data[[i]],my_data$id,FUN=function(x) ifelse(is.na(x), mean(x,na.rm=TRUE), x))}
这是不使用循环的解决方案
my_data[, 3:ncol(my_data)] = apply(my_data[, 3:ncol(my_data)], 2, function(x) ifelse(is.na(x), mean(x,na.rm=TRUE), x))
答案 2 :(得分:0)
在此代码中,您遍历所有Id和所有列,将NA值替换为每个Id的正确均值。
for(id in unique(matriz$id))
{
for(i in 3:ncol(matriz))
{
my_data[is.na(my_data[,i]),i] <- mean(my_data[which(my_data$id == id & my_data$year <= '2003'),i],na.rm = TRUE)
}
}
由于您的数据始于2000年,因此我没有添加条件my_data$year >= '2000'
,如果您有2000年之前的年份,只需添加它即可。
答案 3 :(得分:0)
使用data.table
可以很容易地按列应用函数。
library(data.table)
######creating dummy data
data=data.table(expand.grid(year=2000:2003,id=c("AA","BB","CC","DD")),
V1=sample(c(2:4,NA),16,replace = T),
V2=sample(c(2:4,NA),16,replace = T))
impute=function(x){
x[is.na(x)]=mean(x,na.rm = T)
return(x)
}
data[,lapply(.SD,impute),by=c("id")]