Для строк с дубликатами создайте новый столбец с условным значением

#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. Спасибо тебе, Ронак! Это здорово!