繁体   English   中英

将NA替换为基于id的其他行值

[英]Replace NA with other row value based on id

我想基于ID将NA替换为其他行的值。 我发现了类似的问题,但我找不到解决问题的方法。

下表的一部分

   XCODE Age Sex ResultA ResultB ResultC
1   X001  12   2       2       3       4
2   X002  23   2       4       6      66
3   X003  NA  NA      NA      NA      NA
4   X004  32   1       1       7       3
5   X005  NA  NA      NA      NA      NA
6   X001  NA  NA      NA      NA      NA
7   X002  NA  NA      NA      NA      NA
8   X003  33   1       8       7       6
9   X004  NA  NA      NA      NA      NA
10  X005  55   2       8       8       8

我有超过6000列的SPSS文件。

我用了

library(data.table)
setDT(dataset)[, Age:= Age[!is.na(Age)][1L] , by = XCODE]

但这只适用于单列,我需要处理许多列。

那么如何在所有列上执行上面的代码呢?

使用data.table我们可以选择要replace的列

library(data.table)
setDT(df)[, (2:ncol(df)) := lapply(.SD, function(x) 
            replace(x, is.na(x), x[!is.na(x)][1])) , XCODE]

df
#    XCODE Age Sex ResultA ResultB ResultC
# 1:  X001  12   2       2       3       4
# 2:  X002  23   2       4       6      66
# 3:  X003  33   1       8       7       6
# 4:  X004  32   1       1       7       3
# 5:  X005  55   2       8       8       8
# 6:  X001  12   2       2       3       4
# 7:  X002  23   2       4       6      66
# 8:  X003  33   1       8       7       6
# 9:  X004  32   1       1       7       3
#10:  X005  55   2       8       8       8

dplyr使用相同的逻辑,我们可以用所有列的第一个非NA值替换NA

library(dplyr)

df %>%
  group_by(XCODE) %>%
  mutate_all(~replace(., is.na(.), .[!is.na(.)][1]))


#  XCODE   Age   Sex ResultA ResultB ResultC
#   <fct> <int> <int>   <int>   <int>   <int>
# 1 X001     12     2       2       3       4
# 2 X002     23     2       4       6      66
# 3 X003     33     1       8       7       6
# 4 X004     32     1       1       7       3
# 5 X005     55     2       8       8       8
# 6 X001     12     2       2       3       4
# 7 X002     23     2       4       6      66
# 8 X003     33     1       8       7       6
# 9 X004     32     1       1       7       3
#10 X005     55     2       8       8       8

或者只选择列

cols <- c("Age", "Sex", "ResultA","ResultB")
df %>%
  group_by(XCODE) %>%
  mutate_at(vars(cols), ~ replace(., is.na(.), .[!is.na(.)][1]))

我们可以通过XCODE并使用fill()来填充最新的非NA的NA。 在这种情况下,我们需要填写两个方向。 另请注意,由于您要填充所有变量,因此可以使用函数everything()

library(tidyverse)

df %>% 
 group_by(XCODE) %>% 
 fill(everything()) %>% 
 fill(everything(), .direction = 'up')

这使,

 # A tibble: 10 x 6 # Groups: XCODE [5] XCODE Age Sex ResultA ResultB ResultC <fct> <int> <int> <int> <int> <int> 1 X001 12 2 2 3 4 2 X001 12 2 2 3 4 3 X002 23 2 4 6 66 4 X002 23 2 4 6 66 5 X003 33 1 8 7 6 6 X003 33 1 8 7 6 7 X004 32 1 1 7 3 8 X004 32 1 1 7 3 9 X005 55 2 8 8 8 10 X005 55 2 8 8 8 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM