用R语言记录纵向数据帧中丢失的数据

用R语言记录纵向数据帧中丢失的数据,r,missing-data,panel-data,R,Missing Data,Panel Data,我有一个纵向结构与data相似的数据框: data = data.frame ( ID = c("a","a","a","b","b","b","c","c", "c"), period = c(1,2,3,1,2,3,1,2,3), size = c(3,3,NA, NA, NA,1, 14,14, 14)) 变量size的值是固定的,因此每个时段的size值相同。然而,一些观测值缺失。我的目标是替换这些缺失的值 与没有缺失的时段相关的size值(例如ID“a”为3,ID

我有一个纵向结构与
data
相似的数据框:

data = data.frame (
   ID = c("a","a","a","b","b","b","c","c", "c"), 
   period = c(1,2,3,1,2,3,1,2,3),
   size = c(3,3,NA, NA, NA,1, 14,14, 14))
变量
size
的值是固定的,因此每个时段的
size
值相同。然而,一些观测值缺失。我的目标是替换这些缺失的值 与没有缺失的时段相关的
size
值(例如
ID
“a”为3,
ID
“b”为1)

所需的数据帧应类似于:

data.1 

    ID period value
      a      1     3
      a      2     3
      a      3     3
      b      1     1
      b      2     1
      b      3     1
      c      1    14
      c      2    14
      c      3    14
我尝试了下面公式的不同组合,但没有得到我想要的结果

library(dplyr)

data.1 = data %>% group_by(ID) %>% 
  mutate(new.size = ifelse(is.na(size), !is.na(size),
                          ifelse(!is.na(size), size, 0)))
这将产生以下结果:

data.1
Source: local data frame [9 x 4]
Groups: ID [3]

      ID period  size new.size
  (fctr)  (dbl) (dbl)    (dbl)
1      a      1     3        3
2      a      2     3        3
3      a      3    NA        0
4      b      1    NA        0
5      b      2    NA        0
6      b      3     1        1
7      c      1    14       14
8      c      2    14       14
9      c      3    14       14

如果有人能给我一个关于如何获得正确解决方案的提示,我将不胜感激

这个用base R怎么样:

vals <- unique(na.omit(data[, c("ID", "size")]))
data$size <- vals$size[match(data$ID, vals$ID)]


  ID period size
1  a      1    3
2  a      2    3
3  a      3    3
4  b      1    1
5  b      2    1
6  b      3    1
7  c      1   14
8  c      2   14
9  c      3   14

vals以R为基数的情况如何:

vals <- unique(na.omit(data[, c("ID", "size")]))
data$size <- vals$size[match(data$ID, vals$ID)]


  ID period size
1  a      1    3
2  a      2    3
3  a      3    3
4  b      1    1
5  b      2    1
6  b      3    1
7  c      1   14
8  c      2   14
9  c      3   14

vals要更正代码,可以使用
dplyr尝试以下操作

library(dplyr)
data %>% group_by(ID) %>% 
         mutate(new.size = ifelse(is.na(size), size[!is.na(size)],size))

#      ID   period  size new.size
#     (fctr)  (dbl) (dbl)    (dbl)
#1      a      1     3        3
#2      a      2     3        3
#3      a      3    NA        3
#4      b      1    NA        1
#5      b      2    NA        1
#6      b      3     1        1
#7      c      1    14       14
#8      c      2    14       14
#9      c      3    14       14

或者使用
ave

data$new.size <- ave(data$size,data$ID, FUN=function(x)unique(x[!is.na(x)]))
data$new.size

#[1]  3  3  3  1  1  1 14 14 14

data$new.size要更正您的代码,您可以使用
dplyr

library(dplyr)
data %>% group_by(ID) %>% 
         mutate(new.size = ifelse(is.na(size), size[!is.na(size)],size))

#      ID   period  size new.size
#     (fctr)  (dbl) (dbl)    (dbl)
#1      a      1     3        3
#2      a      2     3        3
#3      a      3    NA        3
#4      b      1    NA        1
#5      b      2    NA        1
#6      b      3     1        1
#7      c      1    14       14
#8      c      2    14       14
#9      c      3    14       14

或者使用
ave

data$new.size <- ave(data$size,data$ID, FUN=function(x)unique(x[!is.na(x)]))
data$new.size

#[1]  3  3  3  1  1  1 14 14 14

data$new.size这里是另一个使用
dplyr
na.omit

group_by(data, ID) %>%
     mutate(value=na.omit(size)[1])
Source: local data frame [9 x 4]
Groups: ID [3]

      ID period  size value
  <fctr>  <dbl> <dbl> <dbl>
1      a      1     3     3
2      a      2     3     3
3      a      3    NA     3
4      b      1    NA     1
5      b      2    NA     1
6      b      3     1     1
7      c      1    14    14
8      c      2    14    14
9      c      3    14    14
分组依据(数据,ID)%>%
变异(值=na.省略(大小)[1])
来源:本地数据帧[9 x 4]
组别:ID[3]
ID周期大小值
1A133
2 a 2 3 3
3 a 3 NA 3
4 b 1 NA 1
5 b 2 NA 1
6B311
7 c 1 14 14
8 c 2 14 14
9 c 3 14 14

请注意,如果您正在寻找最大值,例如,您可以将
na.omit
替换为
max(size,na.rm=TRUE)

这里使用
dplyr
的另一个解决方案是
na.omit

group_by(data, ID) %>%
     mutate(value=na.omit(size)[1])
Source: local data frame [9 x 4]
Groups: ID [3]

      ID period  size value
  <fctr>  <dbl> <dbl> <dbl>
1      a      1     3     3
2      a      2     3     3
3      a      3    NA     3
4      b      1    NA     1
5      b      2    NA     1
6      b      3     1     1
7      c      1    14    14
8      c      2    14    14
9      c      3    14    14
分组依据(数据,ID)%>%
变异(值=na.省略(大小)[1])
来源:本地数据帧[9 x 4]
组别:ID[3]
ID周期大小值
1A133
2 a 2 3 3
3 a 3 NA 3
4 b 1 NA 1
5 b 2 NA 1
6B311
7 c 1 14 14
8 c 2 14 14
9 c 3 14 14

请注意,如果您正在寻找最大值,您可以将
na.omit
替换为
max(size,na.rm=TRUE)

您也可以使用
dplyr
执行,即
data%>%group\u by(ID)%%>%mutate(new.size=size[!is.na(size)][1])
您也可以使用
dplyr
data%>%group\u by(ID)%%>%mutate执行(new.size=size[!is.na(size)][1])