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