拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何找到具有值的最后一列(对于每一行),某些行的值全部为NA?

如何找到具有值的最后一列(对于每一行),某些行的值全部为NA?

白鹭 - 2022-02-12 2179 0 0

我遇到了与如何在 R 中找到具有值的最后一列(对于每一行)相同的问题,除了我有没有值的行(NA 的整行)。所述帖子中提供的样本没有一整排 NA。

我想知道我应该如何修改以下内容?我不想洗掉那些带有所有 NA 的行,因为它们在以后的分析中很有用。

df %>%
  rowwise %>% 
  mutate(m = {tmp <- c_across(starts_with('m'))
               tail(na.omit(tmp), 1)}) %>%
  ungroup

非常感谢!

uj5u.com热心网友回复:

如果行中的所有元素都为空,那么一般的解决方案是创建条件以回传NA这些行

library(dplyr)
df %>%
  rowwise %>% 
  mutate(m = {tmp <- c_across(starts_with('m'))
               if(all(is.na(tmp))) NA_character_ else 
                   tail(na.omit(tmp), 1)}) %>%
  ungroup

-输出

# A tibble: 4 × 5
     id m_1   m_2   m_3   m    
  <dbl> <chr> <chr> <chr> <chr>
1     1 a     e     i     i    
2     2 b     <NA>  <NA>  b    
3     3 <NA>  <NA>  <NA>  <NA> 
4     4 d     h     l     l    

如果 OP 只想回传最后一个非 NA 元素,我们也可以添加一个索引[1]来提取,NA当没有元素时自动回传

df %>%
  rowwise %>% 
  mutate(m = {tmp <- c_across(starts_with('m'))
               tail(na.omit(tmp), 1)[1]}) %>%
  ungroup
# A tibble: 4 × 5
     id m_1   m_2   m_3   m    
  <dbl> <chr> <chr> <chr> <chr>
1     1 a     e     i     i    
2     2 b     <NA>  <NA>  b    
3     3 <NA>  <NA>  <NA>  <NA> 
4     4 d     h     l     l    

资料

df <- structure(list(id = c(1, 2, 3, 4), m_1 = c("a", "b", NA, "d"), 
    m_2 = c("e", NA, NA, "h"), m_3 = c("i", NA, NA, "l")), row.names = c(NA, 
-4L), class = "data.frame")

uj5u.com热心网友回复:

使用来自@akrun 的资料(非常感谢)我们可以这样做:

'\\b[^,] $' 是一个正则表达式:

\\... 表示转义(即不匹配)这R在其他语言中很特殊,只有一种\

\\b... 元字符 \b 是一个锚点^$符号。它在称为“词边界”的位置匹配。这个匹配是零长度的。

[^,] ... 代表字符类,这里特殊的^插入符号:一个不是 的字符, 这里意思是一个或多个,

$ ... 表示字符串结束或行结束,具体取决于多行模式。

library(dplyr)
library(tidyr)
library(stringr)

df %>% 
  mutate(across(starts_with("m"), ~case_when(!is.na(.) ~ cur_column()), .names = 'new_{col}')) %>%
  unite(New_Col, starts_with('new'), na.rm = TRUE, sep = ', ') %>% 
  mutate(New_Col = str_extract(New_Col, '\\b[^,] $'))
  id  m_1  m_2  m_3 New_Col
1  1    a    e    i     m_3
2  2    b <NA> <NA>     m_1
3  3 <NA> <NA> <NA>    <NA>
4  4    d    h    l     m_3

uj5u.com热心网友回复:

library(tidyverse)
df <- data.frame(id = c(1, 2, 3, 4), m_1 = c("a", NA, "c", "d"), m_2 = c("e", NA, "g", "h"), m_3 = c("i", NA, NA, "l"))


df %>%
  rowwise() %>%
  mutate(
    nms = list(str_subset(names(df), "^m")),
    m = c_across(starts_with("m")) %>%
      {
        ifelse(test = all(is.na(.)),
          yes = NA,
          no = nms[which(. == tail(na.omit(.), 1))]
        )
      }
  ) %>%
  select(-nms)
#> # A tibble: 4 × 5
#> # Rowwise: 
#>      id m_1   m_2   m_3   m    
#>   <dbl> <chr> <chr> <chr> <chr>
#> 1     1 a     e     i     m_3  
#> 2     2 <NA>  <NA>  <NA>  <NA> 
#> 3     3 c     g     <NA>  m_2  
#> 4     4 d     h     l     m_3




# only the value no the column name
df %>%
  rowwise() %>%
  mutate(
    m = c_across(starts_with("m")) %>%
      {
        ifelse(test = all(is.na(.)),
          yes = NA,
          no = tail(na.omit(.), 1)
        )
      }
  )
#> # A tibble: 4 × 5
#> # Rowwise: 
#>      id m_1   m_2   m_3   m    
#>   <dbl> <chr> <chr> <chr> <chr>
#> 1     1 a     e     i     i    
#> 2     2 <NA>  <NA>  <NA>  <NA> 
#> 3     3 c     g     <NA>  g    
#> 4     4 d     h     l     l

reprex 包(v2.0.1)于 2022 年 1 月 1 日创建

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *