добавление половины значения одной строки разными группами в кадре данных - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующее dataframe:

structure(list(trial = c("ES1-7", "ES1-7", "ES1-7", "ES14-25", 
"ES14-25", "ES14-25", "ES26-38", "ES26-38", "ES26-38", "ES8-13", 
"ES8-13", "ES8-13", "SA1-13", "SA1-13", "SA1-13", "SA14-25", 
"SA14-25", "SA14-25"), marker = c("0", "1", "2", "0", "1", "2", 
"0", "1", "2", "0", "1", "2", "0", "1", "2", "0", "1", "2"), 
n = c(873L, 269L, 2114L, 2300L, 673L, 5959L, 3410L, 1200L, 
7930L, 599L, 173L, 1538L, 2834L, 509L, 6953L, 3082L, 757L, 
6875L), prop = c(0.268120393120393, 0.0826167076167076, 0.649262899262899, 
0.257501119570085, 0.0753470667263771, 0.667151813703538, 
0.271929824561404, 0.0956937799043062, 0.63237639553429, 
0.259307359307359, 0.0748917748917749, 0.665800865800866, 
0.275252525252525, 0.0494366744366744, 0.6753108003108, 0.287661004293448, 
0.0706552174724659, 0.641683778234086)), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -18L), vars = "trial", 
labels = structure(list(
trial = c("ES1-7", "ES14-25", "ES26-38", "ES8-13", "SA1-13", 
"SA14-25")), row.names = c(NA, -6L), class = "data.frame", vars = "trial", 
drop = TRUE), indices = list(
0:2, 3:5, 6:8, 9:11, 12:14, 15:17), drop = TRUE, group_sizes = c(3L, 
3L, 3L, 3L, 3L, 3L), biggest_group_size = 3L)

Это выглядит так:

# A tibble: 6 x 4
# Groups:   trial [2]
trial   marker     n   prop
<chr>   <chr>  <int>  <dbl>
1 ES1-7   0        873 0.268 
2 ES1-7   1        269 0.0826
3 ES1-7   2       2114 0.649 
4 ES14-25 0       2300 0.258 
5 ES14-25 1        673 0.0753
6 ES14-25 2       5959 0.667 

Я хочу group_by за trial и добавить половину prop значение, когда marker равно 1 другим строкам, когда marker равно 0 или 2.

Например, при группировании по ES1-7 у меня будет следующее propзначение: 0,268+ (0,0826 / 2), когда marker равно 0.

Ожидаемый результат для групп ES1-7 и ES14-25 будет:

 # A tibble: 6 x 4
 # Groups:   trial [2]
 trial   marker     n   prop
 <chr>   <chr>  <int>  <dbl>
 1 ES1-7   0        873 0.268+(0.0826/2) 
 2 ES1-7   1        269 0.0826
 3 ES1-7   2       2114 0.649+(0.0826/2) 
 4 ES14-25 0       2300 0.258+(0.0753/2)
 5 ES14-25 1        673 0.0753
 6 ES14-25 2       5959 0.667+(0.0753/2) 

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Также возможна dplyr:

df %>%
 group_by(trial) %>%
 mutate(prop = ifelse(marker != 1, prop + prop[marker == 1]/2, prop))

   trial   marker     n   prop
   <chr>   <chr>  <int>  <dbl>
 1 ES1-7   0        873 0.309 
 2 ES1-7   1        269 0.0826
 3 ES1-7   2       2114 0.691 
 4 ES14-25 0       2300 0.295 
 5 ES14-25 1        673 0.0753
 6 ES14-25 2       5959 0.705 
 7 ES26-38 0       3410 0.320 
 8 ES26-38 1       1200 0.0957
 9 ES26-38 2       7930 0.680 
10 ES8-13  0        599 0.297 
0 голосов
/ 26 февраля 2019

Сделал это в два этапа.Сначала сгруппированы по пробам и отфильтрованы по маркеру == 1, рассчитано 1/2 пропЗатем объединили это с исходным data.frame, используя пробу в качестве ключа, и вычислили prop.new = prop + prop.half.Это можно упростить до одного шага, но подумал, что это было бы хорошим началом для вас, чтобы больше экспериментировать с кодом

esl, конечно, это ваши data.frame

esl %>% group_by(trial) %>%
filter(marker ==1) %>%
mutate(prop.half = prop/2) %>% select(trial,marker,prop.half) -> esl.half

left_join(esl, esl.half, by="trial") %>%
mutate(prop.new = prop+prop.half)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...