Ich habe eine df wie unten mit 3 Spalten. Ich möchte eine neue Spalte hinzufügen, code
die die Spalte action
basierend auf zwei anderen Spalten codiert . Hier ist Sudo-Code, wie man eine code
Spalte generiert
for each user_id
for each session
if action V comes before P then Code column value is VP
if action P and no V then Code column value is P
if action P comes before V then Code column value is PV
df <- read.table(text="
user_id session action
1 1 P
1 1 N
1 2 V
1 2 P
1 2 V
2 1 N
2 1 V
2 1 V
2 1 P
2 2 P", header=T)
Mein Ergebnis wird also sein:
df
user_id session action Code
1 1 P P
1 1 N P
1 2 V VPV
1 2 P VPV
1 2 V VPV
2 1 N VP
2 1 V VP
2 1 V VP
2 1 P VP
2 2 P P
Kein Code sollte länger als VPV und PVP sein, daher sollten wir kein VPVV oder PVPV haben
Hier können wir eine kleine Hilfsfunktion schreiben, um den Code zu erhalten
get_code <- function(x, keep=c("P","V"), max_len=3) {
as.character(x[x %in% keep]) %>%
{rle(.)$values} %>%
paste(collapse="") %>%
substr(1, max_len)
}
df %>%
group_by(user_id, session) %>%
mutate(code=get_code(action))]
# user_id session action code
# <int> <int> <fct> <chr>
# 1 1 1 P P
# 2 1 1 N P
# 3 1 2 V VPV
# 4 1 2 P VPV
# 5 1 2 V VPV
# 6 2 1 N VP
# 7 2 1 V VP
# 8 2 1 V VP
# 9 2 1 P VP
# 10 2 2 P P
Das rle
hilft, die Folge von eindeutigen Werten ohne Duplikate zu erhalten, dann fügen wir diese in der Reihenfolge zusammen, in der sie angezeigt wurden.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen