繁体   English   中英

从最后一个非 na 列获取最新的更新值

[英]Get the latest updated value from last non-na column

我有一个这样的 dataframe

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中的bd替换ac而不调用字符即ab (制作另一列也是一个不错的选择,对吗?)

对此有什么建议吗?

所需 output

    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 <- 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

填充NA,然后使用从右到左的合并,获取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    

暂无
暂无

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

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