记录R中唯一子列的数量

时间:2019-03-25 04:40:51

标签: r dataframe

我的数据框如下

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 个答案:

答案 0 :(得分:3)

我认为您正在寻找

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

答案 1 :(得分:0)

使用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