簡體   English   中英

R在ifelse中按組改變一列

[英]R mutate a column by group in ifelse

我想改變 R data.table中的一列。

這是我的數據示例。

df <- data.table(id=c(1,1,1,2,2,2,3,3,3), 
                 stopId=c("a","b","c","a","b","c","a","b","c"),
category=c(1,1,1,NA,NA,NA,2,2,2),
                 result = c('a','a','a','b','b','b','c','c','c'))

我的目標是使用if-else命令創建一個列。 該列將是groupId group by id的第一個值。

關鍵是在變異時,值應該按組相同。

如果categoryNA ,那么結果應該是groupId的最后一個值。

這是我期待的結果。

   id groupId category result
1:  1       a        1      a
2:  1       b        1      a
3:  1       c        1      a
4:  2       a       NA      b
5:  2       c       NA      b
6:  2       b       NA      b
7:  3       c        2      c
8:  3       b        2      c
9:  3       a        2      c

data.table

df[,result:=fifelse(is.na(category),last(stopId),first(stopId)),by=id][]

   id stopId category result
1:  1      a        1      a
2:  1      b        1      a
3:  1      c        1      a
4:  2      a       NA      c
5:  2      b       NA      c
6:  2      c       NA      c
7:  3      a        2      a
8:  3      b        2      a
9:  3      c        2      a

正如它的名字一樣,通過使用firstlast

df %>%
  group_by(id) %>%
  mutate(resultt = ifelse(is.na(category), last(stopId), first(stopId)))
     id stopId category result resultt
  <dbl> <chr>     <dbl> <chr>  <chr>  
1     1 a             1 a      a      
2     1 b             1 a      a      
3     1 c             1 a      a      
4     2 a            NA b      b      
5     2 c            NA b      b      
6     2 b            NA b      b      
7     3 c             2 c      c      
8     3 b             2 c      c      
9     3 a             2 c      c 

您提供的數據與上面不同...

我們可以使用.N1為每組索引stopId

> df[, result := stopId[ifelse(is.na(category), .N, 1)], id][]
   id stopId category result
1:  1      a        1      a
2:  1      b        1      a
3:  1      c        1      a
4:  2      a       NA      c
5:  2      b       NA      c
6:  2      c       NA      c
7:  3      a        2      a
8:  3      b        2      a
9:  3      c        2      a

或更短

> df[, result := stopId[c(1, .N)[is.na(category) + 1]], id][]
   id stopId category result
1:  1      a        1      a
2:  1      b        1      a
3:  1      c        1      a
4:  2      a       NA      c
5:  2      b       NA      c
6:  2      c       NA      c
7:  3      a        2      a
8:  3      b        2      a
9:  3      c        2      a

暫無
暫無

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

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