【问题标题】:R replace NA with value from adjacent rowR用相邻行的值替换NA
【发布时间】:2019-10-24 16:57:53
【问题描述】:

我有一个包含两列的数据框“df”。第 2 列包含有效字符串和用“NA”填充的缺失值。

输入示例:

> df

ENSMMUG00000023296 PGBD2 
ENSMMUG00000036181 U6
ENSMMUG00000064799 NA
ENSMMUG00000057389 LYPD8

我想用第 1 列中的相应值替换“NA”值。实现以下输出。

所需的输出示例:

> df

ENSMMUG00000023296 PGBD2 
ENSMMUG00000036181 U6
ENSMMUG00000064799 ENSMMUG00000064799
ENSMMUG00000057389 LYPD8

我尝试使用 zoo 包中的 na.locf 工具执行此操作,但我不明白如何指定应从第 1 列获取替换值。

尝试失败:

> library(zoo)
> na.locf(df)

ENSMMUG00000023296 PGBD2 
ENSMMUG00000036181 U6
ENSMMUG00000064799 U6
ENSMMUG00000057389 LYPD8

【问题讨论】:

  • 只要df$col2[is.na(df$col2)] <- df$col1[is.na(df$col2)]。 (假设'df'是一个data.frame。请用你的列名更改列名)

标签: r zoo


【解决方案1】:

另一个选项,假设您有一个包含“column1”和“column2”列的data.frame

library(dplyr)

df <- tribble(~column1, ~column2,
              'ENSMMUG00000023296', 'PGBD2',
              'ENSMMUG00000036181', 'U6',
              'ENSMMUG00000064799', NA,
              'ENSMMUG00000057389', 'LYPD8')
df
#> # A tibble: 4 x 2
#>   column1            column2
#>   <chr>              <chr>  
#> 1 ENSMMUG00000023296 PGBD2  
#> 2 ENSMMUG00000036181 U6     
#> 3 ENSMMUG00000064799 <NA>   
#> 4 ENSMMUG00000057389 LYPD8

mutate(df, column2 = ifelse(is.na(column2), column1, column2))
#> # A tibble: 4 x 2
#>   column1            column2           
#>   <chr>              <chr>             
#> 1 ENSMMUG00000023296 PGBD2             
#> 2 ENSMMUG00000036181 U6                
#> 3 ENSMMUG00000064799 ENSMMUG00000064799
#> 4 ENSMMUG00000057389 LYPD8

【讨论】:

  • 如果您确定df$column1 上没有缺失值,您也可以使用mutate(df, column2 = coalesce(column2, column1)
【解决方案2】:

假设您有两列,您可以简单地使用以下内容:-

df$column2[is.na(df$column2)] <- df$column1[is.na(df$column2)]

这不包括NA 中的第二列的极端情况。

【讨论】:

  • 我现在看到了你的评论,是的,是一样的。
猜你喜欢
  • 2021-09-22
  • 2015-07-28
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2013-03-15
相关资源
最近更新 更多