Ich versuche, den Wert einer Spalte basierend auf den Werten von zwei anderen Spalten zu ändern. Es bereitet mir bisher ein bisschen Kopfschmerzen und ich bin mir nicht sicher, ob es überhaupt möglich ist.
Mein Datensatz sieht so aus. Eine Spalte ist die Zeit, und die anderen beiden Spalten spiegeln eine Elternbeziehung der Nachkommen wider. In seltsamen Fällen wie zum Zeitpunkt 1 habe ich den Nachwuchs "D", der zum ersten Mal im Datensatz auftaucht, und er war im vorherigen Zeitpunkt nicht da, um sowohl als Nachwuchs als auch als Vater gleichzeitig zu dienen Zeit.
Daten
structure(list(time = c(0L, 0L, 0L, 1L, 1L, 1L, 2L, 2L, 2L),
offspring = c("A", "B", "C", "A", "D", "E", "A", "F", "G"
), parent = c(NA, NA, NA, "A", "B", "D", "A", "A", "F")), class = "data.frame", row.names = c(NA,
-9L))
Ich würde gerne helfen
alle Nachkommen zu finden, die zu einem einmaligen Zeitpunkt existieren, aber nicht zu dem vorherigen (ohne Berücksichtigung des Zeitpunkts 0) und sowohl als Nachkommen als auch als Vater wie D und F zu dienen
Wenn ich sie finde, möchte ich einen genauen Zeitpunkt um 0,5 reduzieren
time offspring parent
0 A NA
0 B NA
0 C NA
1 A A
0.5 D B
1 E D
2 A A
1.5 F A
2 G F
Jede Hilfe oder Anleitung in dieser Ausgabe wäre sehr dankbar.
In data.table, wenn Sie möchten:
library(data.table)
DT <- data.table(time = c(0,0,0,1,1,1,2,2,2),
offspring = c('A', 'B', 'C', 'A', 'D', 'E', 'A', 'F', 'G'),
parent = c(NA, NA, NA, 'A', 'B', 'D', 'A', 'A', 'F'))
for (i in seq_len(nrow(DT))) {
DT[i, time := fifelse(time != 0 & offspring %chin% DT[, parent] & !(offspring %chin% DT[seq_len(i-1), offspring]),
time - 0.5,
time)]
}
> DT
time offspring parent
1: 0.0 A <NA>
2: 0.0 B <NA>
3: 0.0 C <NA>
4: 1.0 A A
5: 0.5 D B
6: 1.0 E D
7: 2.0 A A
8: 1.5 F A
9: 2.0 G F
mit dplyr:
library(dplyr)
library(tibble)
tbl <- tibble(time = c(0,0,0,1,1,1,2,2,2),
offspring = c('A', 'B', 'C', 'A', 'D', 'E', 'A', 'F', 'G'),
parent = c(NA, NA, NA, 'A', 'B', 'D', 'A', 'A', 'F'))
for (i in seq_len(nrow(tbl))) {
tbl[i,][['time']] <- tbl[i, ] %>% mutate(time = if_else(time != 0 &
offspring %in% tbl[['parent']] &
!(offspring %in% tbl[seq_len(i-1),][['offspring']]),
time - 0.5,
time)) %>% pull(time)
}
> tbl
# A tibble: 9 x 3
time offspring parent
<dbl> <chr> <chr>
1 0 A NA
2 0 B NA
3 0 C NA
4 1 A A
5 0.5 D B
6 1 E D
7 2 A A
8 1.5 F A
9 2 G F
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