【问题标题】:Get the latest updated value from last non-na column从最后一个非 na 列中获取最新的更新值
【发布时间】:2021-09-28 18:23:54
【问题描述】:

我有一个这样的数据框

df <- data.frame(name1 = c("a" , "a", "a", "a", "c", "c", "c", "c"),
                 name2 = c(NA,"a","a",NA, NA, "c", "c", NA),
                 name3 = c(NA, "b", "b", NA, NA, "d","d",NA))

然后,我确实根据一些条件做了一个新的专栏

library(tidyverse)
df %>% mutate(name4 = ifelse(!is.na(name3), name3, name1))

    name1 name2 name3 name4
1     a  <NA>  <NA>     a
2     a     a     b     b
3     a     a     b     b
4     a  <NA>  <NA>     a
5     c  <NA>  <NA>     c
6     c    c     d      d
7     c    c     d      d
8     c  <NA>  <NA>     c   

我想分别在name4 中将ac 替换为bd,而不调用字符,即ab。 (制作另一列也是一个不错的选择,对吧?)

对此有何建议?

期望的输出

    name1 name2 name3 name4
1     a  <NA>  <NA>     b
2     a     a     b     b
3     a     a     b     b
4     a  <NA>  <NA>     b
5     c  <NA>  <NA>     d
6     c    c     d      d
7     c    c     d      d
8     c  <NA>  <NA>     d   

【问题讨论】:

  • 我不理解,您能否澄清一下,为什么 a 在 name4 列中变为 b?
  • 假设 name2 列中的 a 将更改为 name3 列中的 b。然后,name4 列就像包含旧名称和新名称的最后一列
  • 或者name3列中的字符作为我的第一优先使用,然后是name1列,但现在我想将标准旧名称a改为新名称b。清楚吗?
  • 我认为您正在寻找合并,请参阅stackoverflow.com/q/19253820/680068
  • @zx8754 不,先生,因为我的真实数据框很长,name1 列中有不同的字符,我想保留它。 Coalesce 将从我的数据框中删除这些名称。

标签: r dplyr


【解决方案1】:

填充 NA,然后从右到左使用coalesce,获取name4列的最新名称:

df %>% 
  group_by(name1) %>% 
  fill(name2, name3, .direction = "downup") %>% 
  mutate(name4 = coalesce(name3, name2, name1))

## A tibble: 8 x 4
## Groups:   name1 [2]
#  name1 name2 name3 name4
#  <chr> <chr> <chr> <chr>
#1 a     a     b     b    
#2 a     a     b     b    
#3 a     a     b     b    
#4 a     a     b     b    
#5 c     c     d     d    
#6 c     c     d     d    
#7 c     c     d     d    
#8 c     c     d     d    

【讨论】:

    【解决方案2】:

    这里有两个可能的答案:

    df <- data.frame(name1 = c("a" , "a", "a", "a", "c", "c", "c", "c"),
                     name2 = c(NA,"a","a",NA, NA, "c", "c", NA),
                     name3 = c(NA, "b", "b", NA, NA, "d","d",NA))
    library(tidyverse)
    df %>% mutate(name4 = ifelse(!is.na(name3), name3, name1), 
                  name4=sub('a','b', sub('c','d',name4)))
    #>   name1 name2 name3 name4
    #> 1     a  <NA>  <NA>     b
    #> 2     a     a     b     b
    #> 3     a     a     b     b
    #> 4     a  <NA>  <NA>     b
    #> 5     c  <NA>  <NA>     d
    #> 6     c     c     d     d
    #> 7     c     c     d     d
    #> 8     c  <NA>  <NA>     d
    df %>% mutate(name4 = ifelse(!is.na(name3), name3, name1), 
                  name4=c('a'='b','c'='d','b'='b','d'='d')[name4])
    #>   name1 name2 name3 name4
    #> 1     a  <NA>  <NA>     b
    #> 2     a     a     b     b
    #> 3     a     a     b     b
    #> 4     a  <NA>  <NA>     b
    #> 5     c  <NA>  <NA>     d
    #> 6     c     c     d     d
    #> 7     c     c     d     d
    #> 8     c  <NA>  <NA>     d
    

    reprex package (v2.0.1) 于 2021-09-28 创建

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2011-12-05
      相关资源
      最近更新 更多