Вот опция с добавлением tidyverse
library(dplyr)
library(tidyr)
# for each user carry valid action2 results forward
df1 <- df %>%
group_by(user) %>%
tidyr::fill(action2)
# replace missing values so they can be pasted
df1$action2 <- ifelse(is.na(df1$action2), "", df1$action2)
# add valid action2 results to action1 where action1 is "P"
df1$new <- ifelse(df1$action1 == "P",
paste0("P", df1$action2),
df1$action1)
# A tibble: 11 x 4
# Groups: user [2]
user action1 action2 new
<int> <chr> <chr> <chr>
1 1 A "a" A
2 1 B "a" B
3 1 P "a" Pa
4 1 P "a" Pa
5 1 A "ac" A
6 1 P "ac" Pac
7 2 B "" B
8 2 P "" P
9 2 A "aa" A
10 2 P "aa" Paa
11 2 AB "aa" AB
stringAsFactors = FALSE
в считанные данные:
df<-read.table(text="
user action1 action2
1 A a
1 B NA
1 P NA
1 P NA
1 A ac
1 P NA
2 B NA
2 P NA
2 A aa
2 P NA
2 AB aa",header=T, stringsAsFactors = FALSE)