繁体   English   中英

通过 R 中的组确定值是否重复

[英]Identify if a value is repeated or not by groups in R

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

所以我的数据是这样的:

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

任何saggestion将不胜感激。 谢谢。

一种方法如下。 就我看到的问题而言,当一组中的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][]

这是一个基本的 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM