#r #duplicates #matching
#r #дубликаты #соответствие
Вопрос:
Некоторые примеры данных:
x <- data.frame(c(1992, 1992, 1992, 1994, 1994, 1995, 1992, 1992, 1993), c("Taliban", "Taliban", "Taliban", "Taliban", "Taliban", "Taliban", "Afghanistan", "Afghanistan", "Afghanistan"), c(300, 300, 300, 100, 100, 250, 25, 25, 60))
colnames(x) <- c("year", "actor", "deaths")
x$year <- as.integer(x$year) # this is to match the class of my actual data
Моя цель — создать и заполнить новый столбец «even_deaths» значением, основанным на следующих условиях: если год и актер совпадают более чем в одной строке, то «even_deaths» будет числом «смертей», деленным на количество повторяющихся строк.
Короче говоря, я хочу, чтобы новый фрейм данных выглядел следующим образом:
year actor deaths even_deaths
1992 Taliban 300 100
1992 Taliban 300 100
1992 Taliban 300 100
1994 Taliban 100 50
1994 Taliban 100 50
1995 Taliban 250 250
1992 Afghanistan 25 12.5
1992 Afghanistan 25 12.5
1993 Afghanistan 60 60
Набор данных особенно велик с более чем 1 тыс. участников, поэтому я надеюсь, что не нужно будет указывать каждого отдельного. Кроме того, в идеале я мог бы выполнять любые действия только с теми строками, которые имеют дубликаты (в отличие от просто повторяющихся и уникальных строк). Любая помощь очень ценится, и я приношу извинения, если формулировка расплывчата.
Приветствия,
Ардешир
Ответ №1:
Вы можете использовать base R
функцию ave
x$even_deaths <- ave(x$deaths, x$year, x$actor, FUN = function(x) x/length(x))
x
# year actor deaths even_deaths
#1 1992 Taliban 300 100.0
#2 1992 Taliban 300 100.0
#3 1992 Taliban 300 100.0
#4 1994 Taliban 100 50.0
#5 1994 Taliban 100 50.0
#6 1995 Taliban 250 250.0
#7 1992 Afghanistan 25 12.5
#8 1992 Afghanistan 25 12.5
#9 1993 Afghanistan 60 60.0
Комментарии:
1. Спасибо тебе, Ронак! Это здорово!