I have a dataframe and I need to mutate a row.
Here is the 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))
I have to mark the "trip" column with a sting "detected" if a value within the groups A is present.
Group A is marked as corrected because in the group A a trip (1) i present.
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
thx for your help
You can create groups with rleid
and assign 'corrected'
for groups that have atleast one non-NA value.
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
You can also use it in dplyr
:
library(dplyr)
df %>%
group_by(grp = rleid(groups, type)) %>%
mutate(trip_corrected = if(any(!is.na(trip))) 'corrected' else '') %>%
ungroup
We can use 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 ''))
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.