簡體   English   中英

如果R中滿足條件,則將值從一列移到新列

[英]Take values from one column to new column if conditions met in R

我有一個如下所示的數據框(df),下面的列

“由我解決”列的索引值為“ TRUE / FALSE”。 它說票是否由我解決。

row  Tkt.number  Group   solved.by.me
1    Tkt478111  Group A  FALSE
2    Tkt478111  Group B  FALSE
3    Tkt478111  Group C  FALSE
4    Tkt478111  Group A  FALSE
5    Tkt478111  Group A  FALSE
6    Tkt478111  Group X  FALSE
7    Tkt478111  Group A  FALSE
8    Tkt478111  Group X  FALSE
9    Tkt478145  Group A  TRUE
10   Tkt478145  Group A  TRUE
11   Tkt478145  Group B  TRUE
12   Tkt478145  Group B  TRUE
13   Tkt478145  Group B  TRUE

我想檢查以下情況,並將結果存儲在新列Moved.out.from中

條件:

  1. 如果“由我解決”為假
  2. 如果票證正在從指定的組列表(例如“ grp_list”-組A,B,C,D)中移出,而不返回到所提及的組
 row Tkt Group solved.by.me Moved.out.from 1 Tkt478111 Group A FALSE 2 Tkt478111 Group B FALSE 3 Tkt478111 Group C FALSE 4 Tkt478111 Group A FALSE 5 Tkt478111 Group A FALSE 6 Tkt478111 Group X FALSE 7 Tkt478111 Group A FALSE Group A 8 Tkt478111 Group X FALSE 9 Tkt478145 Group A TRUE 10 Tkt478145 Group A TRUE 11 Tkt478145 Group B TRUE 12 Tkt478145 Group B TRUE 13 Tkt478145 Group B TRUE 

請注意第7行,其中“ Tkt478111”正在從組A中移出(在我們的預定義列表中可用)並且沒有返回,但是在第5行中則不正確,因為它從組A中移出並再次返回。 (組X在預定義的組列表中不可用)

我是R的新手,不知道如何處理。 任何想法如何執行此操作? 在此先感謝您的幫助 !

我確定有人會用簡單的dplyr / data.table方法解決該問題,但是與此同時,這是使用base R的一種方法:

df <- read.table(text='row  Tkt  Group   solved.by.me
1    Tkt478111  A  FALSE
2    Tkt478111  B  FALSE
3    Tkt478111  C  FALSE
4    Tkt478111  A  FALSE
5    Tkt478111  A  FALSE
6    Tkt478111  X  FALSE
7    Tkt478111  A  FALSE
8    Tkt478111  X  FALSE
9    Tkt478145  A  TRUE
10   Tkt478145  A  TRUE
11   Tkt478145  B  TRUE
12   Tkt478145  B  TRUE
13   Tkt478145  B  TRUE', header=TRUE, stringsAsFactors=FALSE)

grps <- c('A', 'B', 'C', 'D')

newdf <- do.call(rbind, 
                 lapply(split(df, df$Tkt), function(x) {
                   i <- which(x$Group %in% grps & !x$solved.by.me)
                   x$moved.from <- NA
                   if (length(i) > 0 && tail(i, 1) != nrow(x)) {
                     x$moved.from[tail(i, 1)] <- x$Group[tail(i, 1)] 
                   }
                   x
                 }))

row.names(newdf) <- NULL

newdf

#    row       Tkt Group solved.by.me moved.from
# 1    1 Tkt478111     A        FALSE       <NA>
# 2    2 Tkt478111     B        FALSE       <NA>
# 3    3 Tkt478111     C        FALSE       <NA>
# 4    4 Tkt478111     A        FALSE       <NA>
# 5    5 Tkt478111     A        FALSE       <NA>
# 6    6 Tkt478111     X        FALSE       <NA>
# 7    7 Tkt478111     A        FALSE          A
# 8    8 Tkt478111     X        FALSE       <NA>
# 9    9 Tkt478145     A         TRUE       <NA>
# 10  10 Tkt478145     A         TRUE       <NA>
# 11  11 Tkt478145     B         TRUE       <NA>
# 12  12 Tkt478145     B         TRUE       <NA>
# 13  13 Tkt478145     B         TRUE       <NA>

暫無
暫無

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

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