R 如何识别行中重复的元素
我有一个数据框,看起来像这样,但总共有31个变量(列)和11000个观察值(缺少的值为空): 我想按行确定是否存在“T”类型变量的任何重复元素,因此我的df如下所示:R 如何识别行中重复的元素,r,duplicates,R,Duplicates,我有一个数据框,看起来像这样,但总共有31个变量(列)和11000个观察值(缺少的值为空): 我想按行确定是否存在“T”类型变量的任何重复元素,因此我的df如下所示: T1 = c("a1", "c1", "e1", "d1", "a3", "f1", "f2") T2 = c("b1", "d1", "a1", "b2", "a3", "f1", "f3") T3 = c(NA, NA, "e1", "d1", NA, "a4", "f3") T4 = c( NA, NA, NA,
T1 = c("a1", "c1", "e1", "d1", "a3", "f1", "f2")
T2 = c("b1", "d1", "a1", "b2", "a3", "f1", "f3")
T3 = c(NA, NA, "e1", "d1", NA, "a4", "f3")
T4 = c( NA, NA, NA, b2, NA, "b3", "f5")
T5 = c( NA, NA, NA, NA, NA, "a4", "f6")
T6 = c( NA, NA, NA, NA, NA, NA, "f7")
T7 = c(NA, NA, NA, NA, NA, NA, "c1")
T8 = c(NA, NA, NA, NA, NA, NA, "c1")
T9 = c(NA, NA, NA, NA, NA, NA, "f2")
T10= c(NA, NA, NA, NA, NA, NA, "f3")
D = c(F, F, T, T, T, T, T)
我试图编写一个函数,但显然我错过了一些东西,因为它不起作用:
首先,我创建了一个带有空值的新变量
df$D <- ""
df$D我是dplyr
和tidyverse
的粉丝,这就是为什么我要走这条路线:
df <- data.frame(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
df %>%
mutate(index = row_number()) %>%
gather(key, value, -index, na.rm = T) %>%
group_by(index) %>%
summarise(D = any(duplicated(value))) %>%
cbind(df)
df%
变异(索引=行号())%>%
聚集(键,值,-索引,na.rm=T)%>%
分组依据(指数)%>%
汇总(D=任何(重复(值)))%>%
cbind(df)
以下仅使用基本R
df1$D <- apply(df1, 1, function(x) {
x <- na.omit(x)
any(unlist(Map('==', x[1], x[-1])))
})
df1
# T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 D
#1 a1 b1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> FALSE
#2 c1 d1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> FALSE
#3 e1 a1 e1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#4 d1 b2 d1 b2 <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#5 a3 a3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#6 f1 f1 a4 b3 a4 <NA> <NA> <NA> <NA> <NA> TRUE
#7 f2 f3 f3 f5 f6 f7 c1 c1 f2 f3 TRUE
请使用dput
显示示例。值a1
,c1
等是字符串,需要引用。您可以通过将代码复制/粘贴到R控制台中进行检查,看看它是否有效。选项是apply(df1,1,FUN=function(x)anyDuplicated(x[x!=“”])
多亏了你们两位的评论,现在最后一段代码有效了,仍然不知道函数有什么问题,但我认为主要的是有一个解决方案。我从原始数据中删除了其他列,忘记了包含id列,但在我用它计算的代码中,这就是为什么我没有得到正确的数据。再次感谢。你有答案,请阅读你的问题时要做什么。事实上,我使用了代码,我把它放在自己只需要纠正它,但从答案中我更喜欢第二个,所以我选择了那个。无法表明有用性,因为我对这一点还不熟悉,而且我的声誉很低(但我确实这么做了,只是这里没有显示)。是的,我还在学习游戏规则。谢谢你。我对R比较陌生,所以我不知道如何从这段代码中获取D的对象。分析11000行是很困难的。不,我只是不知道如何使用您的代码将结果添加到我的df中。我可以在控制台中得到答案,但我需要它作为df中的新变量。使用此代码可以得到我想要的结果:df$D,因此我添加了cbind
,这将把它添加到您的df
。
df$D <- apply(df[-1], 1, function(i) any(duplicated(i, incomparables = NA)))
df <- data.frame(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
df %>%
mutate(index = row_number()) %>%
gather(key, value, -index, na.rm = T) %>%
group_by(index) %>%
summarise(D = any(duplicated(value))) %>%
cbind(df)
df1$D <- apply(df1, 1, function(x) {
x <- na.omit(x)
any(unlist(Map('==', x[1], x[-1])))
})
df1
# T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 D
#1 a1 b1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> FALSE
#2 c1 d1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> FALSE
#3 e1 a1 e1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#4 d1 b2 d1 b2 <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#5 a3 a3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> TRUE
#6 f1 f1 a4 b3 a4 <NA> <NA> <NA> <NA> <NA> TRUE
#7 f2 f3 f3 f5 f6 f7 c1 c1 f2 f3 TRUE
v <- stringr::str_sort(ls(pattern = '^T[[:digit:]]+$'), numeric = TRUE)
df1 <- data.frame(mget(v))