我有一个包含许多列和行的数据。我想确定是否通过创建新的逻辑变量为组重复(相同)一个值。
所以我的数据如下:
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
任何不屑一顾将不胜感激。谢谢。
答案 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