识别值是否由R中的组重复

时间:2020-01-14 13:07:09

标签: r grouping

我有一个包含许多列和行的数据。我想确定是否通过创建新的逻辑变量为组重复(相同)一个值。

所以我的数据如下:

v0 <- c(1,2,3,4,5,6,7,8,9)
v1 <- c("a", "b", "a", "c","e", "c", "b", "b", "e")
v2 <- c("R", NA, "R", "R", "G","C", "R", "R", "G")
dftest <- data.frame(v0, v1, v2)

  v0 v1   v2
1  1  a    R
2  2  b <NA>
3  3  a    R
4  4  c    R
5  5  e    G
6  6  c    C
7  7  b    R
8  8  b    R
9  9  e    G

我需要以相同的v1值是否采用相同的v2值的方式比较v1和v2的值。所以我的输出df看起来像这样:

v3 <- c(T, F, T, F, T, F, F, F, T )
dfresult <- data.frame(v0, v1, v2, v3)

  v0 v1   v2    v3
1  1  a    R  TRUE
2  2  b <NA> FALSE
3  3  a    R  TRUE
4  4  c    R FALSE
5  5  e    G  TRUE
6  6  c    C FALSE
7  7  b    R FALSE
8  8  b    R FALSE
9  9  e    G  TRUE

任何不屑一顾将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:2)

以下是一种方法。就我所看到的问题而言,似乎您想在组v2中只有一个唯一值时返回TRUE。否则,您要返回FALSE。

library(dplyr)

group_by(dftest, v1) %>% 
mutate(v3 = n_distinct(v2) == 1)

#     v0 v1    v2    v3   
#  <dbl> <fct> <fct> <lgl>
#1     1 a     R     TRUE 
#2     2 b     NA    FALSE
#3     3 a     R     TRUE 
#4     4 c     R     FALSE
#5     5 e     G     TRUE 
#6     6 c     C     FALSE
#7     7 b     R     FALSE
#8     8 b     R     FALSE
#9     9 e     G     TRUE

如果使用data.table包,则可以执行以下操作。

setDT(dftest)[, v3 := uniqueN(v2) == 1, by = v1][]

答案 1 :(得分:1)

这是基本的R解决方案,其中使用了ave

dfresult <- within(dftest, v3 <- as.logical(ave(as.vector(v2),v1,FUN = function(x) length(unique(x))==1)))

这样

> dfresult
  v0 v1   v2    v3
1  1  a    R  TRUE
2  2  b <NA> FALSE
3  3  a    R  TRUE
4  4  c    R FALSE
5  5  e    G  TRUE
6  6  c    C FALSE
7  7  b    R FALSE
8  8  b    R FALSE
9  9  e    G  TRUE

答案 2 :(得分:0)

使用data.table软件包的选项:

library(data.table)
setDT(dftest)[, v3 := uniqueN(v2)==1L, v1]

输出:

   v0 v1   v2    v3
1:  1  a    R  TRUE
2:  2  b <NA> FALSE
3:  3  a    R  TRUE
4:  4  c    R FALSE
5:  5  e    G  TRUE
6:  6  c    C FALSE
7:  7  b    R FALSE
8:  8  b    R FALSE
9:  9  e    G  TRUE