我的数据框如下
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命令?
答案 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