问题描述
我有一个数据框,我需要改变一行。
这是数据框
structure(list(groups = structure(c(1L,1L,2L,4L,3L,2L),.Label = c("A","B","C","F"),class = "factor"),type = structure(c(1L,.Label = c("Apple","Bread","curry","Fish"
),trip = c(NA,NA,1,2,3,4,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 ''))