首页 > 解决方案 > 将一行数据框中的 NA 替换为其他数据框中的值

问题描述

我想用另一行的值替换一行中的 NA,示例数据是:

group <-c('A','A_old')
year1<- c(NA,'20')
year2<- c(NA,'40')
year3<- c('20','230')
datac=data_frame(group,year1,year2,year3)

在此处输入图像描述

group <-c('A','A_old')
year1<- c('20','20')
year2<- c('40','40')
year3<- c('20','230')
finaldatac=data_frame(group,year1,year2,year3)

在此处输入图像描述

原始表要大得多,因此无法一一引用每个元素并分配值。

谢谢!

为了下面的论点,我需要用它们的名字来引用行值,因为原始表很大,我不能只玩两行。例如在下表中,我想将第 1 行(组==A)替换为第 5 行(组==E)。数据在这里:

group <-c('A','B','C','D','E','F','G')
year1<- c(NA,'100',NA,'200','300',NA,NA)
year2<- c(NA,'100',NA,'200','300','50','40')
year3<- c('20','100',10,'200','300','150','230')
data=data.frame(group,year1,year2,year3)

所以我想得到:

group <-c('A','B','C','D','E','F','G')
year1<- c('300','100',NA,'200','300',NA,NA)
year2<- c('300','100',NA,'200','300','50','40')
year3<- c('20','100',10,'200','300','150','230')
data=data.frame(group,year1,year2,year3)

在此处输入图像描述

标签: rreplacerowna

解决方案


除了使用fillor na.locf,您还可以执行以下操作:

datac %>%
  group_by(grp = gsub("_.*", "", group)) %>%
  mutate_at(vars(contains("year")),
                 funs(.[!is.na(.)])) %>%
  ungroup() %>% select(-grp)

输出:

# A tibble: 2 x 4
  group year1 year2 year3
  <chr> <chr> <chr> <chr>
1 A     20    40    20   
2 A_old 20    40    230  

对于您的第二个示例,您可以执行以下操作:

data %>%
  mutate_at(
    vars(contains("year")), 
    funs(
      case_when(
        group == "A" & is.na(.) ~ .[group == "E"],
        TRUE ~ .)
      )
    )

输出:

  group year1 year2 year3
1     A   300   300    20
2     B   100   100   100
3     C  <NA>  <NA>    10
4     D   200   200   200
5     E   300   300   300
6     F  <NA>    50   150
7     G  <NA>    40   230

您还可以将其他条件添加到case_when.

例如,如果您还想C用 group 的内容替换 years D,您可以添加:

data %>%
  mutate_at(
    vars(contains("year")), 
    funs(
      case_when(
        group == "A" & is.na(.) ~ .[group == "E"],
        group == "C" & is.na(.) ~ .[group == "D"],
        TRUE ~ .)
    )
  )

推荐阅读