Как создать новый столбец на основе конкретных условий других столбцов в R?

#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  

введите описание изображения здесь