[英]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.