r создание живых старших братьев и сестер при браке эго

Вот лучшая версия моего предыдущего вопроса: у меня есть набор данных о матерях (mid), детях (id), рождении (born), смерти (dead) и дате свадьбы (Marriage_Date) этих детей. ord указывает порядок рождения, tstart и tstop год въезда, выезда лица, находящегося под наблюдением. tstart3 и tstop3 обозначают возраст человека в каждый интервал наблюдения. время наблюдения указано в формате анализа выживания, то есть оно сокращается каждый год (сокращается по периодам).

Из детей я хочу создать один столбец с изменяющимся во времени числом старших братьев и сестер, если возможно, мужчин и женщин отдельно, которые живы, когда эго (id) находится под наблюдением (и, следовательно, когда он или она женится - что событие моего анализа). Сам фрейм данных изменять не следует, так как это необходимый формат для анализа выживаемости. что должно измениться, так это количество братьев и сестер, живущих в tstop для каждого человека. Если родной брат рождается у уже существующего ребенка, новый столбец старшие братья и сестры получает +1, следующий плюс один добавляется до тех пор, пока идентификатор матери снова не изменится. если родной брат умирает, - 1 до рождения следующего.

Итак, на мой взгляд, решение должно быть чем-то вроде цикла for, который группируется по midid?)

Вот извлечение данных в формате dput:

structure(list(id = c("1799939", "1799939", "1799939", "1799939", 
"1799939", "1799939", "1799939", "1132576", "1132576", "1132576", 
"1132576", "1132576", "1132576", "1132576", "1132576", "1112778", 
"1112778", "1112778", "1112778", "1112778", "1112778", "1112778", 
"1112778", "1112778", "1667687", "1667687", "1667687", "1667687", 
"1667687", "1667687", "1667687", "1667687", "1667687", "1667687", 
"1667687", "1667687", "1667687", "1667687", "1667687", "1667687", 
"1667687", "1667687", "1667687", "1667687", "1667687", "1667687", 
"1667687", "1667687", "1667687", "1667687", "1667687", "1667687", 
"1667687", "1667687", "1667687", "1667687", "1667687", "1933509", 
"1933509", "1933509", "1933509", "1933509", "1933509", "1933509", 
"1933509", "1933509", "1097672", "1097672", "1097672", "1097672", 
"1097672", "1097672", "1097672", "1097672", "1097672", "1097672", 
"1097672", "1097672", "1097672", "1097672", "1039958", "1039958", 
"1039958", "1039958", "1039958", "1039958", "1039958"), mid = c("1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004212", 
"1004212", "1004241", "1004241", "1004241", "1004241", "1004241", 
"1004241", "1004241"), born = c(1813.5698630137, 1813.5698630137, 
1813.5698630137, 1813.5698630137, 1813.5698630137, 1813.5698630137, 
1813.5698630137, 1815.48767123288, 1815.48767123288, 1815.48767123288, 
1815.48767123288, 1815.48767123288, 1815.48767123288, 1815.48767123288, 
1815.48767123288, 1818.01095890411, 1818.01095890411, 1818.01095890411, 
1818.01095890411, 1818.01095890411, 1818.01095890411, 1818.01095890411, 
1818.01095890411, 1818.01095890411, 1820.2131147541, 1820.2131147541, 
1820.2131147541, 1820.2131147541, 1820.2131147541, 1820.2131147541, 
1820.2131147541, 1820.2131147541, 1820.2131147541, 1820.2131147541, 
1820.2131147541, 1820.2131147541, 1820.2131147541, 1820.2131147541, 
1820.2131147541, 1820.2131147541, 1820.2131147541, 1820.2131147541, 
1820.2131147541, 1820.2131147541, 1820.2131147541, 1820.2131147541, 
1820.2131147541, 1820.2131147541, 1820.2131147541, 1820.2131147541, 
1820.2131147541, 1820.2131147541, 1820.2131147541, 1820.2131147541, 
1820.2131147541, 1820.2131147541, 1820.2131147541, 1824.33333333333, 
1824.33333333333, 1824.33333333333, 1824.33333333333, 1824.33333333333, 
1824.33333333333, 1824.33333333333, 1824.33333333333, 1824.33333333333, 
1826.89589041096, 1826.89589041096, 1826.89589041096, 1826.89589041096, 
1826.89589041096, 1826.89589041096, 1826.89589041096, 1826.89589041096, 
1826.89589041096, 1826.89589041096, 1826.89589041096, 1826.89589041096, 
1826.89589041096, 1826.89589041096, 1828.28142076503, 1828.28142076503, 
1828.28142076503, 1828.28142076503, 1828.28142076503, 1828.28142076503, 
1828.28142076503), dead = c(1863.97808219178, 1863.97808219178, 
1863.97808219178, 1863.97808219178, 1863.97808219178, 1863.97808219178, 
1863.97808219178, 1844.07103825137, 1844.07103825137, 1844.07103825137, 
1844.07103825137, 1844.07103825137, 1844.07103825137, 1844.07103825137, 
1844.07103825137, 1890.85205479452, 1890.85205479452, 1890.85205479452, 
1890.85205479452, 1890.85205479452, 1890.85205479452, 1890.85205479452, 
1890.85205479452, 1890.85205479452, 1871.81643835616, 1871.81643835616, 
1871.81643835616, 1871.81643835616, 1871.81643835616, 1871.81643835616, 
1871.81643835616, 1871.81643835616, 1871.81643835616, 1871.81643835616, 
1871.81643835616, 1871.81643835616, 1871.81643835616, 1871.81643835616, 
1871.81643835616, 1871.81643835616, 1871.81643835616, 1871.81643835616, 
1871.81643835616, 1871.81643835616, 1871.81643835616, 1871.81643835616, 
1871.81643835616, 1871.81643835616, 1871.81643835616, 1871.81643835616, 
1871.81643835616, 1871.81643835616, 1871.81643835616, 1871.81643835616, 
1871.81643835616, 1871.81643835616, 1871.81643835616, 1902.33150684932, 
1902.33150684932, 1902.33150684932, 1902.33150684932, 1902.33150684932, 
1902.33150684932, 1902.33150684932, 1902.33150684932, 1902.33150684932, 
1862.01643835616, 1862.01643835616, 1862.01643835616, 1862.01643835616, 
1862.01643835616, 1862.01643835616, 1862.01643835616, 1862.01643835616, 
1862.01643835616, 1862.01643835616, 1862.01643835616, 1862.01643835616, 
1862.01643835616, 1862.01643835616, 1852.22950819672, 1852.22950819672, 
1852.22950819672, 1852.22950819672, 1852.22950819672, 1852.22950819672, 
1852.22950819672), Marriage_Date = c(1837.8602739726, 1837.8602739726, 
1837.8602739726, 1837.8602739726, 1837.8602739726, 1837.8602739726, 
1837.8602739726, 1838.3397260274, 1838.3397260274, 1838.3397260274, 
1838.3397260274, 1838.3397260274, 1838.3397260274, 1838.3397260274, 
1838.3397260274, 1844.91256830601, 1844.91256830601, 1844.91256830601, 
1844.91256830601, 1844.91256830601, 1844.91256830601, 1844.91256830601, 
1844.91256830601, 1844.91256830601, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1850.10684931507, 1850.10684931507, 
1850.10684931507, 1850.10684931507, 1850.10684931507, 1850.10684931507, 
1850.10684931507, 1850.10684931507, 1850.10684931507, 1857.06301369863, 
1857.06301369863, 1857.06301369863, 1857.06301369863, 1857.06301369863, 
1857.06301369863, 1857.06301369863, 1857.06301369863, 1857.06301369863, 
1857.06301369863, 1857.06301369863, 1857.06301369863, 1857.06301369863, 
1857.06301369863, NA, NA, NA, NA, NA, NA, NA), start3 = c(0, 
0.430136986301477, 1.43013698630148, 2.43013698630148, 3.43013698630148, 
4.43013698630148, 5.43013698630148, 0, 0.512328767123336, 1.51232876712334, 
2.51232876712334, 3.51232876712334, 4.51232876712334, 6.51232876712334, 
5.51232876712334, 0, 0.989041095890343, 1.98904109589034, 2.98904109589034, 
3.98904109589034, 4.98904109589034, 5.98904109589034, 6.98904109589034, 
7.98904109589034, 0, 0.786885245901658, 1.78688524590166, 2.78688524590166, 
3.78688524590166, 4.78688524590166, 5.78688524590166, 6.78688524590166, 
7.78688524590166, 8.78688524590166, 9.78688524590166, 10.7868852459017, 
11.7868852459017, 12.7868852459017, 13.7868852459017, 14.7868852459017, 
15.7868852459017, 16.7868852459017, 17.7868852459017, 18.7868852459017, 
19.7868852459017, 20.7868852459017, 21.7868852459017, 22.7868852459017, 
23.7868852459017, 24.7868852459017, 25.7868852459017, 26.7868852459017, 
27.7868852459017, 28.7868852459017, 29.7868852459017, 30.7868852459017, 
31.7868852459017, 0, 0.666666666666742, 1.66666666666674, 2.66666666666674, 
3.66666666666674, 4.66666666666674, 5.66666666666674, 6.66666666666674, 
7.66666666666674, 0, 0.104109589041173, 1.10410958904117, 2.10410958904117, 
3.10410958904117, 4.10410958904117, 5.10410958904117, 6.10410958904117, 
7.10410958904117, 8.10410958904117, 9.10410958904117, 10.1041095890412, 
12.1041095890412, 11.1041095890412, 0, 0.718579234972594, 1.71857923497259, 
2.71857923497259, 3.71857923497259, 5.71857923497259, 4.71857923497259
), stop3 = c(0.430136986301477, 1.43013698630148, 2.43013698630148, 
3.43013698630148, 4.43013698630148, 5.43013698630148, 6.2904109589042, 
0.512328767123336, 1.51232876712334, 2.51232876712334, 3.51232876712334, 
4.51232876712334, 5.51232876712334, 6.85205479452065, 6.51232876712334, 
0.989041095890343, 1.98904109589034, 2.98904109589034, 3.98904109589034, 
4.98904109589034, 5.98904109589034, 6.98904109589034, 7.98904109589034, 
8.90160940190117, 0.786885245901658, 1.78688524590166, 2.78688524590166, 
3.78688524590166, 4.78688524590166, 5.78688524590166, 6.78688524590166, 
7.78688524590166, 8.78688524590166, 9.78688524590166, 10.7868852459017, 
11.7868852459017, 12.7868852459017, 13.7868852459017, 14.7868852459017, 
15.7868852459017, 16.7868852459017, 17.7868852459017, 18.7868852459017, 
19.7868852459017, 20.7868852459017, 21.7868852459017, 22.7868852459017, 
23.7868852459017, 24.7868852459017, 25.7868852459017, 26.7868852459017, 
27.7868852459017, 28.7868852459017, 29.7868852459017, 30.7868852459017, 
31.7868852459017, 32, 0.666666666666742, 1.66666666666674, 2.66666666666674, 
3.66666666666674, 4.66666666666674, 5.66666666666674, 6.66666666666674, 
7.66666666666674, 7.77351598173527, 0.104109589041173, 1.10410958904117, 
2.10410958904117, 3.10410958904117, 4.10410958904117, 5.10410958904117, 
6.10410958904117, 7.10410958904117, 8.10410958904117, 9.10410958904117, 
10.1041095890412, 11.1041095890412, 12.1671232876713, 12.1041095890412, 
0.718579234972594, 1.71857923497259, 2.71857923497259, 3.71857923497259, 
4.71857923497259, 5.94808743169392, 5.71857923497259), ord = c("1", 
"1", "1", "1", "1", "1", "1", "2", "2", "2", "2", "2", "2", "2", 
"2", "3", "3", "3", "3", "3", "3", "3", "3", "3", "4", "4", "4", 
"4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", 
"4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", 
"4", "4", "4", "4", "6", "6", "6", "6", "6", "6", "6", "6", "6", 
"7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", 
"7", "1", "1", "1", "1", "1", "1", "1"), tstart = c(1831.5698630137, 
1832, 1833, 1834, 1835, 1836, 1837, 1831.48767123288, 1832, 1833, 
1834, 1835, 1836, 1838, 1837, 1836.01095890411, 1837, 1838, 1839, 
1840, 1841, 1842, 1843, 1844, 1838.2131147541, 1839, 1840, 1841, 
1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 
1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 
1864, 1865, 1866, 1867, 1868, 1869, 1870, 1842.33333333333, 1843, 
1844, 1845, 1846, 1847, 1848, 1849, 1850, 1844.89589041096, 1845, 
1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1857, 
1856, 1846.28142076503, 1847, 1848, 1849, 1850, 1852, 1851), 
    tstop = c(1832, 1833, 1834, 1835, 1836, 1837, 1837.8602739726, 
    1832, 1833, 1834, 1835, 1836, 1837, 1838.3397260274, 1838, 
    1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1844.91256830601, 
    1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 
    1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 
    1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 
    1869, 1870, 1870.2131147541, 1843, 1844, 1845, 1846, 1847, 
    1848, 1849, 1850, 1850.10684931507, 1845, 1846, 1847, 1848, 
    1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857.06301369863, 
    1857, 1847, 1848, 1849, 1850, 1851, 1852.22950819672, 1852
    )), .Names = c("id", "mid", "born", "dead", "Marriage_Date", 
"start3", "stop3", "ord", "tstart", "tstop"), row.names = c(NA, 
-87L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = c("mid", 
"id"), drop = TRUE, indices = list(66:79, 15:23, 7:14, 24:56, 
    0:6, 57:65, 80:86), group_sizes = c(14L, 9L, 8L, 33L, 7L, 
9L, 7L), biggest_group_size = 33L, labels = structure(list(mid = c("1004212", 
"1004212", "1004212", "1004212", "1004212", "1004212", "1004241"
), id = c("1097672", "1112778", "1132576", "1667687", "1799939", 
"1933509", "1039958")), row.names = c(NA, -7L), class = "data.frame", vars = c("mid", 
"id"), drop = TRUE, .Names = c("mid", "id")))

Одним из моих многочисленных испытаний было следующее:

fam <- fam[
  with(fam, order(mid, ord)),
]

#fam <- fam[ which(fam$mid > 1004211 & fam$mid < 1004246 ) ,]

fam <- group_by(fam, mid, id) 

for(i in 1:nrow(fam)){
  fam$older_sibs_alive[i] <- length(which(fam$mid==fam$mid[i]) & fam$id==fam$id[i] & lag(fam$dead) < fam$Marriage_Date[i])
}

Конечно, не то, что я хочу.

Есть ли кто-нибудь, у кого есть решение? Большое спасибо.


person Ben Mat    schedule 22.12.2017    source источник
comment
На первый взгляд вы хотите rank каждого человека по возрасту среди братьев и сестер в каждом поперечном сечении (т.е. by семья, время). Я не за компьютером, но вы должны найти ответы, выполнив поиск по рангу по группе r   -  person MichaelChirico    schedule 22.12.2017


Ответы (1)


Следующее решение делает то, что, как я думаю, вы просите:

Код


library(dplyr)

fam %>%
  ungroup() %>% # data provided was in a grouped_df, ungroup the data for a clean slate
  select(sibling.id = id, 
         mid, 
         sibling.born = born, 
         sibling.dead = dead, 
         ord) %>% # select only the fields that we need to know about siblings
  distinct(sibling.id, 
           mid, 
           sibling.born, 
           sibling.dead, 
           sibling.ord = as.numeric(ord)) %>% # select distinct siblings
  inner_join(fam, by = c("mid" = "mid")) %>% # join siblings onto the original fam dataset
  group_by_at(vars(one_of(colnames(fam)))) %>% # group by all the columns in the original fam dataset
  summarise(n_older_siblings = #count the records where
              sum(sibling.id != id & # the row is a sibling
                    sibling.born <= tstop & # the sibling has been born
                    sibling.dead > tstop & # the sibling is not yet dead
                    sibling.ord < as.numeric(ord))) %>% # the sibling was born first
  select(-contains("sibling.")) -> fam # remove the sibling columns

Объяснение

Для каждой записи в data.frame нам нужно знать о братьях и сестрах человека. Итак, сначала мы создаем новый tibble только с информацией о каждом человеке: id, mid, Born, Dead и ord.

fam %>%
  select(sibling.id = id, 
         mid, 
         sibling.born = born, 
         sibling.dead = dead, 
         ord) %>% 
  distinct(sibling.id, 
           mid, 
           sibling.born, 
           sibling.dead, 
           sibling.ord = as.numeric(ord))

Мы присоединяем этот новый родственный элемент tibble к исходному fam data.frame. Результатом является гораздо большее tibble, где каждая строка представляет собой уникальную комбинацию отдельных лиц, времени и отдельных лиц, связанных с человеком. Если у человека 5 братьев и сестер, то каждая строка из fam теперь будет состоять из 6 строк.

inner_join(fam, by = c("mid" = "mid"))

Мы хотим свернуть это обратно к исходному количеству строк. Мы делаем это, группируя и суммируя данные. Мы группируем по всем столбцам в исходном fam data.frame и суммируем с суммой набора логических выражений, которые кодируют условия, которые вы хотите подсчитать.

group_by_at(vars(one_of(colnames(fam)))) %>% 
  summarise(n_older_siblings =
              sum(sibling.id != id & 
                    sibling.born <= tstop & 
                    sibling.dead > tstop &
                    sibling.ord < as.numeric(ord))) %>% 

group_by_at позволяет нам указать с помощью кода столбцы, по которым мы хотим сгруппироваться, а конкретная реализация vars(one_of(colnames(fam))) означает, что мы группируем по каждому из имен столбцов в fam data.frame.

Наконец, отмените выбор столбцов, содержащих «родной брат». потому что это те, которые мы создали в брате tibble в начале.

person Eumenedies    schedule 22.12.2017
comment
@ Eumenedies: это действительно работает. Я внимательно изучу ваши объяснения, чтобы в следующий раз справиться в одиночку. Я хочу поблагодарить вас. - person Ben Mat; 22.12.2017
comment
@BenMat - Пожалуйста, примите этот ответ, если он делает то, что вам нужно, чтобы пометить ваш вопрос как закрытый. - person Luke C; 22.12.2017