[R] make new collumns with conditions
krissievdh
kr|@@|evdh @end|ng |rom gm@||@com
Mon Jan 25 17:29:41 CET 2021
Hi,
So one thing i could manage to do was this:
d_vigi$combi <- paste(d_vigi$Behavioral.category, d_vigi$Obs.nr, sep = "-")
This created a new column with a combination of the category and the
observation number.
Afterwards I did this:
for(id in d_vigi$combi){
d_vigi$durationpercat[d_vigi$combi==id]<-sum(d_vigi$'Duration.(s).x'[d_vigi$combi==id])
}
So this created another new column with the correct duration per category.
So that means that I have this:
behavior Behavioral category Duration Obs nr species combi durationpercat
Non-vigilant 5 1 red deer Non-vigilant-1 8
Vigilant 2 1 red deer Vigilant-1 4
Vigilant 2 1 red deer Vigilant-1 4
Non-vigilant 3 1 red deer Non-vigilant-1 8
Vigilant 7 2 red deer Vigilant-2 9
Vigilant 2 2 red deer Vigilant-2 9
Non-vigilant 1 2 red deer Non-vigilant-2 1
Unknown 2 2 red deer Unknown-2 2
However, this doesn't work for me further along the line. I have to have
the duration for vigilant behaviour in a separate column. I really don't
know how to get there.
Hopefully, you understand where my problem lies. So I kinda need to have
three columns for vigilant, non-vigilant and unknown. That way I could add
in zero's for the observations where there weren't any vigilant behaviour.
Krissie
Op ma 25 jan. 2021 om 17:01 schreef krissievdh <krissievdh using gmail.com>:
> Hi,
> Thanks for your response.
>
> I do get what you're doing. However, the table I sent is just a small
> piece of the complete database. So for me to have to add in everything with
> structure list (c ......) by hand would be too much work.
> Just to give you an idea, the database is around 16000 rows and has 40
> columns with other variables that I do want to keep. So I kind of want to
> find a way to keep everything and just add a couple of columns with the
> calculated time for vigilant behavior and the percentage.
>
> Still thanks for thinking with me. I am looking into the aggregate
> function. Hopefully, this could be a solution.
>
> krissie
>
>
>
>
>
>
> Op ma 25 jan. 2021 16:44 schreef Rui Barradas <ruipbarradas using sapo.pt>:
>
>> Hello,
>>
>> Try the following.
>> First aggregate the data, then get the totals, then the percentages.
>> Finally, put the species in the result.
>>
>>
>> agg <- aggregate(formula = `duration(s)` ~ `observation nr` + `behavior
>> type`,
>> data = d_vigi,
>> FUN = sum,
>> subset = `behavior type` == 'Vigilant')
>> agg$total <- tapply(d_vigi$`duration(s)`, d_vigi$`observation nr`, FUN =
>> sum)
>> agg$percent <- round(100 * agg$`duration(s)`/agg$total)
>>
>> res <- merge(agg, d_vigi[c(1, 3:4)])
>> res[!duplicated(res), ]
>>
>>
>> Data in dput format:
>>
>>
>> d_vigi <-
>> structure(list(`behavior type` = c("Non-vigilant", "Vigilant",
>> "Vigilant", "Non-vigilant", "Vigilant", "Vigilant", "Non-vigilant",
>> "Unkown"), `duration(s)` = c(5L, 2L, 2L, 3L, 7L, 2L, 1L, 2L),
>> `observation nr` = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), species =
>> c("red deer",
>> "red deer", "red deer", "red deer", "red deer", "red deer",
>> "red deer", "red deer")), class = "data.frame", row.names = c(NA,
>> -8L))
>>
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>> Às 13:57 de 25/01/21, krissievdh escreveu:
>> > Hi,
>> >
>> > I have a dataset (d_vigi)with this kind of data:
>> > behavior type duration(s) observation nr species
>> > Non-vigilant 5 1 red deer
>> > Vigilant 2 1 red deer
>> > Vigilant 2 1 red deer
>> > Non-vigilant 3 1 red deer
>> > Vigilant 7 2 red deer
>> > Vigilant 2 2 red deer
>> > Non-vigilant 1 2 red deer
>> > Unkown 2 2 red deer
>> > Now I have to calculate the percentage of vigilant behavior spent per
>> > observation.
>> >
>> > So eventually I will need to end up with something like this:
>> > Observation nr Species vigilant(s) total (s) percentage of vigilant (%)
>> > 1 red deer 4 12 33
>> > 2 red deer 9 12 75
>> >
>> >
>> > Now I know how to calculate the total amount of seconds per observation.
>> > But I don't know how I get to the total seconds of vigilant behavior per
>> > observation (red numbers). If I could get there I will know how to
>> > calculate the percentage.
>> >
>> >
>> > I calculated the total duration per observation this way:
>> > for(id in d_vigi$Obs.nr){
>> >
>> >
>> d_vigi$t.duration[d_vigi$Obs.nr==id]<-sum(d_vigi$'Duration.(s).x'[d_vigi$Obs.nr==id])
>> > }
>> >
>> > this does work and gives me the total (s) but i don't know how to get to
>> > the sum of the seconds just for the vigilant per observation number. Is
>> > there anyone who could help me?
>> >
>> > Thanks,
>> > Krissie
>> >
>> > [[alternative HTML version deleted]]
>> >
>> > ______________________________________________
>> > R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> > https://stat.ethz.ch/mailman/listinfo/r-help
>> > PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> > and provide commented, minimal, self-contained, reproducible code.
>> >
>>
>
[[alternative HTML version deleted]]
More information about the R-help
mailing list