我正在尝试根据其他两列的值更改一列的值。到目前为止,这让我有些头疼,而且我不确定是否可能。
我的数据集看起来像这样。一栏是时间,其他两栏反映了后代的父母关系。在奇怪的情况下,例如在时间点1,我有了后代“ D”,它在数据集中首次弹出,并且在上一个时间点还没有出现过,可以同时充当后代和父亲时间。
数据
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))
我想要帮助的是
查找一个时间点中存在的所有后代,而不是上一个时间点(不考虑时间点0),并像D和F一样充当后代和父亲
当我找到它们时,我想将一个准确的时间点减少0.5
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
在这个问题上的任何帮助或指导,将不胜感激。
如果需要,在data.table中:
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
与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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句