Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在另一列中用不同的值标识一个值的重复项_R_Duplicates_Unique - Fatal编程技术网

R 在另一列中用不同的值标识一个值的重复项

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和地址的数据帧。通常,我希望每个重复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      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
所有列如果表未分组,现在它根本不分组,您将所有表分组到一个元素中