#r
Вопрос:
У меня есть следующий фрейм данных о хищнике, взаимодействии с добычей, SS=surf.корюшка, SL = sandlance и H = сельдь.
По сути, все, что мне нужно, — это еще одна колонка, в которой указано, было ли доступно хищнику более одного вида во время взаимодействия. Например, если вы посмотрите на индекс 12, добыча была SL, но было доступно 1000 сандлансов и 100 сельдей, мне нужна колонка, в которой можно просто указать 1 или 0, если для хищника было доступно более 2 видов.
Если возможно, я также хотел бы показать, какие другие виды были доступны в длинном формате
Рамки дат у меня есть:
index date site Pred Prey attack passive surf.smelt sandlance herring 17 2015-06-06 cb JCK SS 0 1 20 0 0 26 2015-07-05 cb JCK SS 0 1 100 0 0 12 2016-07-26 cb JCK SL 1 0 0 1000 100 88 2016-07-26 cb JCK H 1 0 0 1000 1000 89 2016-07-26 cb JCK H 1 0 0 0 100 90 2018-08-21 cb JCO SL 1 0 100 500 0 100 2018-08-26 cb JCO SL 1 0 0 1000 100 108 2019-06-22 cb JCO SS 0 1 50 0 100
Фрейм данных, который я хочу:
index date site Pred Prey attack passive surf.smelt sandlance herring OtherPrey? 17 2015-06-06 cb JCK SS 0 1 20 0 0 0 26 2015-07-05 cb JCK SS 0 1 100 0 0 0 12 2016-07-26 cb JCK SL 1 0 0 1000 100 1 88 2016-07-26 cb JCK H 1 0 0 1000 1000 1 89 2016-07-26 cb JCK H 1 0 0 0 100 0 90 2018-08-21 cb JCO SL 1 0 100 500 0 1 100 2018-08-26 cb JCO SL 1 0 0 1000 100 1 108 2019-06-22 cb JCO SS 0 1 50 0 100 1
И, если возможно, я хотел бы определить другие доступные виды:
Data frame I want: index date site Pred Prey attack passive surf.smelt sandlance herring OtherAvailable 17 2015-06-06 cb JCK SS 0 1 20 0 0 0 26 2015-07-05 cb JCK SS 0 1 100 0 0 0 12 2016-07-26 cb JCK SL 1 0 0 1000 100 H 88 2016-07-26 cb JCK H 1 0 0 1000 1000 SL 89 2016-07-26 cb JCK H 1 0 0 0 100 0 90 2018-08-21 cb JCO SL 1 0 100 500 0 SS 100 2018-08-26 cb JCO SL 1 0 0 1000 100 H 108 2019-06-22 cb JCO SS 0 1 50 0 100 H
Комментарии:
1. Пожалуйста, предоставьте свои данные в виде кода, который мы можем отредактировать. Вы можете использовать
dput(data_frame)
2. Вас интересуют даты или индексы для другой добычи?
3. Меня интересует другая доступная добыча, ваш ответ был тем, что я искал. Спасибо!
Ответ №1:
С dplyr
:
df %gt;% rowwise() %gt;% mutate(Other_Prey=ifelse(sum(c_across(surf.smelt:herring)gt;0)gt;=2,1,0)) # A tibble: 8 x 11 # Rowwise: index date site Pred Prey attack passive surf.smelt sandlance herring Other_Prey lt;intgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;intgt; lt;intgt; lt;intgt; lt;intgt; lt;intgt; lt;dblgt; 1 17 2015-06-06 cb JCK SS 0 1 20 0 0 0 2 26 2015-07-05 cb JCK SS 0 1 100 0 0 0 3 12 2016-07-26 cb JCK SL 1 0 0 1000 100 1 4 88 2016-07-26 cb JCK H 1 0 0 1000 1000 1 5 89 2016-07-26 cb JCK H 1 0 0 0 100 0 6 90 2018-08-21 cb JCO SL 1 0 100 500 0 1 7 100 2018-08-26 cb JCO SL 1 0 0 1000 100 1 8 108 2019-06-22 cb JCO SS 0 1 50 0 100 1
Комментарии:
1. Идеально, это именно то, что я искал. Спасибо
Ответ №2:
Мы можем использовать dplyr::if_any
:
library(dplyr) df %gt;% mutate(other_prey = if_any(surf.smelt:herring))
Для «другого доступного» мы можем использовать toString
library(dplyr) df %gt;% rowwise %gt;% mutate(OtherAvailable = toString(names(across(surf.smelt:herring))[as.logical(surf.smelt:herring)]))
Ответ №3:
Это не очень элегантно, но вот один кадр.
library(dplyr) library(stringr) df lt;- data.frame(Prey = c("SS", "SS", "SL", "H", "H", "SL", "SL", "SS"), SS = c(20, 100, 0, 0, 0, 100, 0 ,50), SL = c(0,0,1000, 1000, 0, 500, 1000, 0), H = c(0,0,100,1000,100,0,100,100) ) tb lt;- df %gt;% mutate(SS = SS gt; 0, SL = SL gt; 0, H = H gt; 0, OtherPrey = (rowSums(across(where(is.logical))))-1) tb1 lt;- which(as.matrix(tb[,2:4]), arr.ind = TRUE) tb$Available lt;- tapply(names(tb[,2:4])[tb1[,2]], tb1[,1], paste, collapse=",") tb lt;- tb %gt;% mutate(other = str_replace(Available,Prey,""), AvailableOther = str_replace(other,",","")) %gt;% select(Prey, OtherPrey, AvailableOther) df_new lt;- cbind(df, tb) df_new