Примените функцию к столбцу, если в другом столбце связаны повторяющиеся записи. - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть набор данных, который содержит три переменные, как следует,

x=data.frame("a"=c(1,1,2,3),"b"=c("a","b","c","d"),"c"=c(100,100,200,300))

Если для одного и того же значения «a» существует «n» различных значений b, я бы хотел разделить мое значение «c» на это «n». То есть я хочу вывод, как это,

x=data.frame("a"=c(1,1,2,3),"b"=c("a","b","c","d"),"c"=c(50,50,200,300))

Я знаю, что могу попробовать duplicated(), но не совсем уверен, как это включить. Спасибо!

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Альтернатива:

library(data.table)
as.data.table(x)[, c := c/.N, by="a"][]
#    a b   c
# 1: 1 a  50
# 2: 1 b  50
# 3: 2 c 200
# 4: 3 d 300

Другая база R:

r <- rle(x$a)$lengths
transform(x, c = c/rep(r,r))
#   a b   c
# 1 1 a  50
# 2 1 b  50
# 3 2 c 200
# 4 3 d 300
0 голосов
/ 15 ноября 2018

В базе R вы можете использовать ave().

transform(x, c = c / ave(a, a, FUN = length))
#   a b   c
# 1 1 a  50
# 2 1 b  50
# 3 2 c 200
# 4 3 d 300
0 голосов
/ 15 ноября 2018

Мы группируем по 'a' и затем делим 'c' на n_distinct (количество уникальных элементов) в 'b'

library(dplyr)
x %>% 
    group_by(a) %>%
    mutate(c= c/n_distinct(b))
# A tibble: 4 x 4
# Groups:   a [3]
#      a b         c   new
#  <dbl> <fct> <dbl> <dbl>
#1     1 a       100    50
#2     1 b       100    50
#3     2 c       200   200
#4     3 d       300   300

Обратите внимание, что вышеизложенное основано на описании OP (If for same value of "a", there are "n" different b values).Однако если OP означает different как общее количество элементов, а не разные значения, то вместо n_distinct это будет n().Здесь неясно, потому что оба условия работают

x %>%
   group_by(a) %>%
   mutate(c = c/n())

или с использованием base R

x$c <- x$c/rowSums(table(x[1:2]) > 0)[as.character(x$a)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...