R 在另一列中用不同的值标识一个值的重复项
我有一个ID和地址的数据帧。通常,我希望每个重复ID在所有观察中都有相同的地址,但我的一些ID有不同的地址。我想找到那个些ID上重复的观测值,但至少有两个不同的地址。然后,我想为其中一个随机分配一个新ID(一个以前在DF中不存在的ID) 例如:R 在另一列中用不同的值标识一个值的重复项,r,duplicates,unique,R,Duplicates,Unique,我有一个ID和地址的数据帧。通常,我希望每个重复ID在所有观察中都有相同的地址,但我的一些ID有不同的地址。我想找到那个些ID上重复的观测值,但至少有两个不同的地址。然后,我想为其中一个随机分配一个新ID(一个以前在DF中不存在的ID) 例如: ID Address 1 X 1 X 1 Y 2 Z 2 Z 3 A 3 B 4 C 4 D 4 E 5 F 5 F 5
ID Address
1 X
1 X
1 Y
2 Z
2 Z
3 A
3 B
4 C
4 D
4 E
5 F
5 F
5 F
将返回:
ID Address
1 X
1 X
6 Y
2 Z
2 Z
3 A
7 B
4 C
8 D
9 E
5 F
5 F
5 F
所以第三、第七、第九和第十次观测得到了新的ID。我要提到的是,一个ID有可能有超过2个不同的地址,因此应该为每个唯一的地址授予新的ID
编辑:
我为一个较长的数据帧示例添加了一段代码,其中的rand列应该被忽略,但保留在最终输出中
df <- data.frame(ID = c(1,1,1,2,2,3,3,4,4,4,5,5,5),
Address = c("x","x","y","z","z","a","b","c","d","e",
"f","f","f"),
rand = sample(1:100, 13))
df一个选项是data.table
。按“ID”分组后,如果唯一的
“地址”的数量大于1且“地址”不等于第一个唯一的
“地址”,则获取行索引(.I
),并为这些“ID”分配原始数据集中不存在的“ID”
library(data.table)
i1 <- setDT(df)[, .I[if(uniqueN(Address)>1) Address != unique(Address)[1]], ID]$V1
df[i1, ID := head(setdiff(as.numeric(1:10), unique(df$ID)), length(i1))]
df
# ID Address rand
# 1: 1 x 58
# 2: 1 x 4
# 3: 6 y 75
# 4: 2 z 5
# 5: 2 z 19
# 6: 3 a 55
# 7: 7 b 34
# 8: 4 c 53
# 9: 8 d 98
# 10: 9 e 97
# 11: 5 f 13
# 12: 5 f 64
# 13: 5 f 80
一个选项是data.table
。按“ID”分组后,如果唯一的
“地址”的数量大于1且“地址”不等于第一个唯一的
“地址”,则获取行索引(.I
),并为这些“ID”分配原始数据集中不存在的“ID”
library(data.table)
i1 <- setDT(df)[, .I[if(uniqueN(Address)>1) Address != unique(Address)[1]], ID]$V1
df[i1, ID := head(setdiff(as.numeric(1:10), unique(df$ID)), length(i1))]
df
# ID Address rand
# 1: 1 x 58
# 2: 1 x 4
# 3: 6 y 75
# 4: 2 z 5
# 5: 2 z 19
# 6: 3 a 55
# 7: 7 b 34
# 8: 4 c 53
# 9: 8 d 98
# 10: 9 e 97
# 11: 5 f 13
# 12: 5 f 64
# 13: 5 f 80
这是一个包含tidyr
和函数nest
/unest
library(tidyr)
library(dplyr)
df %>% group_by(ID,Address) %>% nest %>%
`[<-`(duplicated(.$ID),"ID",max(.$ID, na.rm = TRUE) + 1:sum(duplicated(.$ID))) %>%
unnest
# # A tibble: 13 x 3
# ID Address rand
# <dbl> <fctr> <int>
# 1 1 x 58
# 2 1 x 4
# 3 6 y 75
# 4 2 z 5
# 5 2 z 19
# 6 3 a 55
# 7 7 b 34
# 8 4 c 53
# 9 8 d 98
# 10 9 e 97
# 11 5 f 13
# 12 5 f 64
# 13 5 f 80
library(tidyr)
图书馆(dplyr)
df%%>%group_by(ID,地址)%%>%nest%%
`[%
不耐烦
##A tibble:13 x 3
#身份证地址
#
#1 x 58
#2 1 x 4
#3 6 y 75
#4 2 z 5
#5 2 z 19
#6 3 a 55
#7 b 34
#8 4 c 53
#98年8月9日
#109 e 97
#11 5 f 13
#12 5 f 64
#13 5 f 80
如果使用magrittr
,请将[替换为tidyr
和函数nest
/unest
library(tidyr)
library(dplyr)
df %>% group_by(ID,Address) %>% nest %>%
`[<-`(duplicated(.$ID),"ID",max(.$ID, na.rm = TRUE) + 1:sum(duplicated(.$ID))) %>%
unnest
# # A tibble: 13 x 3
# ID Address rand
# <dbl> <fctr> <int>
# 1 1 x 58
# 2 1 x 4
# 3 6 y 75
# 4 2 z 5
# 5 2 z 19
# 6 3 a 55
# 7 7 b 34
# 8 4 c 53
# 9 8 d 98
# 10 9 e 97
# 11 5 f 13
# 12 5 f 64
# 13 5 f 80
library(tidyr)
图书馆(dplyr)
df%%>%group_by(ID,地址)%%>%nest%%
`[%
不耐烦
##A tibble:13 x 3
#身份证地址
#
#1 x 58
#2 1 x 4
#3 6 y 75
#4 2 z 5
#5 2 z 19
#6 3 a 55
#7 b 34
#8 4 c 53
#98年8月9日
#109 e 97
#11 5 f 13
#12 5 f 64
#13 5 f 80
如果使用magrittr
,请更换[您能否提供您的代码?用于创建示例数据框?基于新数据集,预期输出是什么?在问题中添加了更长的示例和更长的结果?您能否提供您的代码?用于创建示例数据框?基于新数据集,预期输出是什么?在问题中添加了更长的示例和更长的结果这看起来非常紧凑,但我在复制它时遇到了一些问题。您使用的是哪个版本的tidyr?我用数据和包版本更新了答案,您有什么错误?我有0.7.1版本,我在
[请参阅更新的解决方案,使用最新的dplyr和您更新的示例我相信nest
默认情况下用于group\u by
所有列如果表未分组,现在它根本不分组,您将所有表分组到一个元素中这看起来非常紧凑,但我在复制它时遇到一些问题。哪个版本您正在使用的tidyr的n?我用数据和软件包版本更新了答案,您有什么错误?我有0.7.1版本,我在
[请参阅更新的解决方案,使用最新的dplyr和更新的示例我相信nest
默认情况下用于group\u by
所有列如果表未分组,现在它根本不分组,您将所有表分组到一个元素中