首页 > 解决方案 > R:如何在某些列匹配的同一数据框中替换列中的 NA?

问题描述

我有一个数据框“玩家”(摘录如下)。每当“匹配”列为 NA 时,我想用来自具有相同“Start.Date”和“Ground”的单独行中的匹配号替换该 NA。例如,下面的第 96588 行具有“匹配”NA,但它具有与第 2 行相同的“Start.Date”和“Ground”。第 2 行与“1”匹配。因此,作为我的查询的结果,我也想将第 96588 行中的“匹配”填充为“1”。

              Player            Start.Date        Inns_Bat    Ground     match
2:            NFD Thomson (AUS) 2018-08-09        1           Lord's     1
3:            NFD Thomson (AUS) 2014-12-12        3           Lord's     23
4:            NFD Thomson (AUS) 2018-08-09        1           Eden G     97
96588:        SM Curran (ENG)   2018-08-09        4           Lord's     NA

预期输出:

              Player            Start.Date        Inns_Bat    Ground     match
2:            NFD Thomson (AUS) 2018-08-09        1           Lord's     1
3:            NFD Thomson (AUS) 2014-12-12        3           Lord's     23
4:            NFD Thomson (AUS) 2018-08-09        1           Eden G     97
96588:        SM Curran (ENG)   2018-08-09        4           Lord's     1

因此,第 96588 行中的“NA”被第 2 行中的“1”替换,因为“Start.Date”和“Ground”在两行中都匹配。它不会从第 3 行或第 4 行替换,因为“Start.Date”或“Ground”与第 96588 行不匹配。

标签: r

解决方案


这是一个tidyverse选项

library(tidvyerse)
df.new <- df %>%
    rowid_to_column("row") %>%
    group_by(Start.Date, Ground) %>%
    fill(match) %>%
    ungroup() %>%
    arrange(row) %>%
    select(-row)
## A tibble: 4 x 5
#  Player            Start.Date Inns_Bat Ground match
#  <fct>             <fct>         <int> <fct>  <int>
#1 NFD Thomson (AUS) 2018-08-09        1 Lord's     1
#2 NFD Thomson (AUS) 2014-12-12        3 Lord's    23
#3 NFD Thomson (AUS) 2018-08-09        1 Eden G    97
#4 SM Curran (ENG)   2018-08-09        4 Lord's     1


df.new[df.new$match == 1, ]
## A tibble: 2 x 5
#  Player            Start.Date Inns_Bat Ground match
#  <fct>             <fct>         <int> <fct>  <int>
#1 NFD Thomson (AUS) 2018-08-09        1 Lord's     1
#2 SM Curran (ENG)   2018-08-09        4 Lord's     1

样本数据

df <- read.table(text =
    "Player            Start.Date        Inns_Bat    Ground     match
'NFD Thomson (AUS)' 2018-08-09        1           'Lord\\'s'     1
'NFD Thomson (AUS)' 2014-12-12        3           'Lord\\'s'     23
'NFD Thomson (AUS)' 2018-08-09        1           'Eden G'     97
'SM Curran (ENG)'   2018-08-09        4           'Lord\\'s'     NA", header = T)

推荐阅读