簡體   English   中英

在 R 中,根據條件對行進行變異

[英]in R mutate rows with conditions

我有一個 dataframe,我需要改變一行。

這是 dataframe

structure(list(groups = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 4L, 4L, 4L, 4L, 1L, 1L, 3L, 3L, 3L, 3L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B", "C", "F"), class = "factor"), 
    type = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
    2L, 1L, 1L, 4L, 4L, 4L, 4L, 1L, 1L, 3L, 3L, 3L, 3L, 2L, 2L, 
    2L, 2L, 2L), .Label = c("Apple", "Bread", "curry", "Fish"
    ), class = "factor"), trip = c(NA, NA, NA, 1, 1, NA, NA, 
    NA, NA, 2, NA, NA, NA, NA, 3, 3, NA, NA, NA, NA, NA, 4, NA, 
    NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-28L))

如果組 A 中的值存在,我必須用“檢測到”的刺標記“行程”列。

組 A 被標記為已糾正,因為在組 A 中存在我的行程 (1)。

groups  type  trip   trip_corrected
1   A   Apple   NA corrected
2   A   Apple   NA corrected
3   A   Apple   NA corrected
4   A   Apple   1  corrected
5   A   Apple   1  corrected
6   B   Bread   NA corrected
7   B   Bread   NA corrected
8   B   Bread   NA corrected
9   B   Bread   NA corrected
10  B   Bread   2  corrected
11  B   Bread   NA corrected
12  A   Apple   NA
13  A   Apple   NA
14  F   Fish    NA corrected
15  F   Fish    3  corrected
16  F   Fish    3  corrected
17  F   Fish    NA corrected
18  A   Apple   NA
19  A   Apple   NA
20  C   curry   NA corrected
21  C   curry   NA corrected
22  C   curry   4  corrected
23  C   curry   NA corrected
24  B   Bread   NA
25  B   Bread   NA
26  B   Bread   NA
27  B   Bread   NA
28  B   Bread   NA

謝謝你的幫助

您可以使用rleid創建組,並為具有至少一個非 NA 值的組分配'corrected'

library(data.table)

setDT(df)[, trip_corrected := if(any(!is.na(trip))) 'corrected' else '',
            rleid(groups, type)]
df

#    groups  type trip trip_corrected
# 1:      A Apple   NA      corrected
# 2:      A Apple   NA      corrected
# 3:      A Apple   NA      corrected
# 4:      A Apple    1      corrected
# 5:      A Apple    1      corrected
# 6:      B Bread   NA      corrected
# 7:      B Bread   NA      corrected
# 8:      B Bread   NA      corrected
# 9:      B Bread   NA      corrected
#10:      B Bread    2      corrected
#11:      B Bread   NA      corrected
#12:      A Apple   NA               
#13:      A Apple   NA               
#14:      F  Fish   NA      corrected
#15:      F  Fish    3      corrected
#16:      F  Fish    3      corrected
#17:      F  Fish   NA      corrected
#18:      A Apple   NA               
#19:      A Apple   NA               
#20:      C curry   NA      corrected
#21:      C curry   NA      corrected
#22:      C curry    4      corrected
#23:      C curry   NA      corrected
#24:      B Bread   NA               
#25:      B Bread   NA               
#26:      B Bread   NA               
#27:      B Bread   NA               
#28:      B Bread   NA               
#    groups  type trip trip_corrected

您也可以在dplyr中使用它:

library(dplyr)

df %>%
  group_by(grp = rleid(groups, type)) %>%
  mutate(trip_corrected = if(any(!is.na(trip))) 'corrected' else '') %>%
  ungroup

我們可以使用base R

df$trip_corrected <- with(df, ave(trip, with(rle(paste(groups, type)),
                 rep(seq_along(values), lengths)),
           FUN = function(x) if(any(!is.na(x))) 'corrected' else ''))

暫無
暫無

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

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