Количество записей уникальных дочерних столбцов в R - PullRequest
0 голосов
/ 25 марта 2019

У меня есть следующий фрейм данных

col1  col2  col3 col4

 1      1     1    1     
 1      1     1    2     
 1      1     1    3     
 1      1     2    1     
 1      1     2    2     
 1      1     3    1     
 1      1     4    2     

x = data.frame(
Col1 = c(1,1,1,1,1,1,1), 
Col2 = c(1,1,1,1,1,1,1), 
Col3 = c(1,2,3,1,2,4,1), 
Col4 = c(1,1,1,2,2,2,3), 
)

Мне нужно создать дополнительный столбец, в котором, если col1, col2 и col3 имеют одинаковое значение, но col4 имеет другое значение, для всех строкс другим col4, новый столбец col5 (по умолчанию 0) должен быть увеличен на 1. Например (строки уведомлений 1,4 и 7)

col1  col2  col3 col4  col5

 1      1     1    1     2
 1      1     1    2     2
 1      1     1    3     2
 1      1     2    1     1
 1      1     2    2     1
 1      1     3    1     0
 1      1     4    2     0

Есть ли способ сделать это, используякоманда r?

Ответы [ 2 ]

3 голосов
/ 25 марта 2019

Я думаю, что вы ищете

library(dplyr)

x %>%
  group_by(Col1, Col2, Col3) %>%
  mutate(col5 = n_distinct(Col4) - 1)

#  Col1  Col2  Col3  Col4  col5
#  <dbl> <dbl> <dbl> <dbl> <dbl>
#1     1     1     1     1     2
#2     1     1     2     1     1
#3     1     1     3     1     0
#4     1     1     1     2     2
#5     1     1     2     2     1
#6     1     1     4     2     0
#7     1     1     1     3     2

Это подсчитывает количество уникальных значений в каждой группе, начиная с 0 (вычитая 1).


, что в базе R будетбыть

with(df, ave(Col4, Col1, Col2, Col3, FUN = function(x) length(unique(x))) - 1)
#[1] 2 1 0 2 1 0 2
0 голосов
/ 25 марта 2019

Использование data.table

library(data.table)
setDT(x)[, Col5 := uniqueN(Col4) - 1, by = Col1:Col3][]
#   Col1 Col2 Col3 Col4 Col5
#1:    1    1    1    1    2
#2:    1    1    2    1    1
#3:    1    1    3    1    0
#4:    1    1    1    2    2
#5:    1    1    2    2    1
#6:    1    1    4    2    0
#7:    1    1    1    3    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...