簡體   English   中英

將 ID 分配給具有 NA 的列

[英]Assign ID to column with NA's

這一定很容易,但我的大腦被阻塞了!

我有這個 dataframe:

   col1 
   <chr>
 1 A    
 2 B    
 3 NA   
 4 C    
 5 D    
 6 NA   
 7 NA   
 8 E    
 9 NA   
10 F    
df <- structure(list(col1 = c("A", "B", NA, "C", "D", NA, NA, "E", 
NA, "F")), row.names = c(NA, -10L), class = c("tbl_df", "tbl", 
"data.frame"))

我想為tidyverse不為 NA 的值添加具有 uniqueID 的列。

預期 output:

   col1  uniqueID
   <chr>    <dbl>
 1 A            1
 2 B            2
 3 NA          NA
 4 C            3
 5 D            4
 6 NA          NA
 7 NA          NA
 8 E            5
 9 NA          NA
10 F            6

我試過: n()row_number()cur_group_id ....

我們可以在data.table中輕松做到這一點。 i中指定條件,即 'col1' 中的非 NA 元素,通過賦值( := )創建具有元素序列的列 'uniqueID'

library(data.table)
setDT(df)[!is.na(col1), uniqueID := seq_len(.N)]

-輸出

df
    col1 uniqueID
 1:    A        1
 2:    B        2
 3: <NA>       NA
 4:    C        3
 5:    D        4
 6: <NA>       NA
 7: <NA>       NA
 8:    E        5
 9: <NA>       NA
10:    F        6

dplyr中,我們可以使用replace

library(dplyr)
df %>%
     mutate(uniqueID = replace(col1, !is.na(col1), 
             seq_len(sum(!is.na(col1)))))

-輸出

# A tibble: 10 x 2
   col1  uniqueID
   <chr> <chr>   
 1 A     1       
 2 B     2       
 3 <NA>  <NA>    
 4 C     3       
 5 D     4       
 6 <NA>  <NA>    
 7 <NA>  <NA>    
 8 E     5       
 9 <NA>  <NA>    
10 F     6  

另一種方法:

library(dplyr)
df %>% 
  mutate(UniqueID = cumsum(!is.na(col1)), 
         UniqueID = if_else(is.na(col1), NA_integer_, UniqueID))

# A tibble: 10 x 2
   col1  UniqueID
   <chr>    <int>
 1 A            1
 2 B            2
 3 NA          NA
 4 C            3
 5 D            4
 6 NA          NA
 7 NA          NA
 8 E            5
 9 NA          NA
10 F            6

使用match + na.omit + unique的基本 R 選項

transform(
  df,
  uniqueID = match(col1, na.omit(unique(col1)))
)

   col1 uniqueID
1     A        1
2     B        2
3  <NA>       NA
4     C        3
5     D        4
6  <NA>       NA
7  <NA>       NA
8     E        5
9  <NA>       NA
10    F        6

一個奇怪的tidyverse解決方案:

library(dplyr)

df %>%
  mutate(id = ifelse(is.na(col1), 0, 1),
         id = cumsum(id == 1), 
         id = ifelse(is.na(col1), NA, id))


# A tibble: 10 x 2
   col1     id
   <chr> <int>
 1 A         1
 2 B         2
 3 NA       NA
 4 C         3
 5 D         4
 6 NA       NA
 7 NA       NA
 8 E         5
 9 NA       NA
10 F         6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM