向dataframe添加新列,并将重复的值粘贴在一起

向dataframe添加新列,并将重复的值粘贴在一起,r,dataframe,R,Dataframe,我有一个df看起来像这样: ID Country 55 Poland 55 Romania 55 France 98 Spain 98 Portugal 98 UK 65 Germany 67 Luxembourg 84 Greece 22 Estonia 22 Lithuania 其中一些ID重复,因为它们属于同一组。我想做的是将所有国家与相同的ID粘贴在一起,得到这样的输出 到目前为止,我试过 ifelse(df[duplicated(df$ID)| duplic

我有一个
df
看起来像这样:

ID  Country
55  Poland
55  Romania
55  France
98  Spain
98  Portugal
98  UK
65  Germany
67  Luxembourg
84  Greece
22  Estonia
22  Lithuania
其中一些
ID
重复,因为它们属于同一组。我想做的是将所有
国家
与相同的
ID
粘贴在一起,得到这样的输出

到目前为止,我试过
ifelse(df[duplicated(df$ID)| duplicated(df$ID,fromLast=TRUE)),paste('Countries',df$Country),NA)
但这不是检索预期输出

使用
dplyr
,一种方法是

library(dplyr)
df %>%
  group_by(ID) %>%
  mutate(new_name = paste0(Country,collapse = " + "), 
         new_name = replace(new_name, duplicated(new_name), NA))

#     ID Country    new_name                 
#   <int> <fct>      <chr>                    
# 1    55 Poland     Poland + Romania + France
# 2    55 Romania    NA                       
# 3    55 France     NA                       
# 4    98 Spain      Spain + Portugal + UK    
# 5    98 Portugal   NA                       
# 6    98 UK         NA                       
# 7    65 Germany    Germany                  
# 8    67 Luxembourg Luxembourg               
# 9    84 Greece     Greece                   
#10    22 Estonia    Estonia + Lithuania      
#11    22 Lithuania  NA                  
库(dplyr)
df%>%
分组依据(ID)%>%
mutate(新名称=paste0(国家,collapse=“+”),
新名称=替换(新名称,重复(新名称),NA))
#ID国家/地区新名称
#                              
#155波兰+罗马尼亚+法国
#2 55罗马尼亚
#3 55法兰西纳
#498西班牙+葡萄牙+英国
#598葡萄牙NA
#698英国NA
#765德国
#8 67卢森堡
#9 84希腊
#10 22爱沙尼亚+立陶宛
#11 22立陶宛
然而,为了获得您确切的预期输出,我们可能需要

df %>%
   group_by(ID) %>%
   mutate(new_name = if (n() > 1) 
         paste0("Countries ", paste0(Country,collapse = " + ")) else Country,
         new_name = replace(new_name, duplicated(new_name), NA))



#     ID Country    new_name                           
#    <int> <fct>      <chr>                              
# 1    55 Poland     Countries Poland + Romania + France
# 2    55 Romania    NA                                 
# 3    55 France     NA                                 
# 4    98 Spain      Countries Spain + Portugal + UK    
# 5    98 Portugal   NA                                 
# 6    98 UK         NA                                 
# 7    65 Germany    Germany                            
# 8    67 Luxembourg Luxembourg                         
# 9    84 Greece     Greece                             
#10    22 Estonia    Countries Estonia + Lithuania      
#11    22 Lithuania  NA                              
df%>%
分组依据(ID)%>%
变异(新名称=if(n()>1)
paste0(“国家”,paste0(国家,塌陷=“+”)其他国家,
新名称=替换(新名称,重复(新名称),NA))
#ID国家/地区新名称
#                                         
#155个波兰国家波兰+罗马尼亚+法国
#2 55罗马尼亚
#3 55法兰西纳
#498个西班牙国家西班牙+葡萄牙+英国
#598葡萄牙NA
#698英国NA
#765德国
#8 67卢森堡
#9 84希腊
#10 22个爱沙尼亚国家爱沙尼亚+立陶宛
#11 22立陶宛

使用
数据表

library(data.table)

setDT(df)[, New_Name := c(paste0(Country, collapse = " + ")[1L],  rep(NA, .N -1)), by = ID]

#df
#ID    Country                  New_Name
#1: 55     Poland Poland + Romania + France
#2: 55    Romania                      <NA>
#3: 55     France                      <NA>
#4: 98      Spain     Spain + Portugal + UK
#5: 98   Portugal                      <NA>
#6: 98         UK                      <NA>
#7: 65    Germany                   Germany
#8: 67 Luxembourg                Luxembourg
#9: 84     Greece                    Greece
#10: 22    Estonia       Estonia + Lithuania
#11: 22  Lithuania                      <NA>
库(data.table)
setDT(df)[,新名称:=c(粘贴0(国家,塌陷=“+”[1L],代表(NA,.N-1)),by=ID]
#df
#ID国家/地区新名称
#1:55波兰+罗马尼亚+法国
#2:55罗马尼亚
#3:55法国
#4:98西班牙+葡萄牙+英国
#5:98葡萄牙
#6:98英国
#7:65德国
#8:67卢森堡
#9:84希腊
#10:22爱沙尼亚+立陶宛
#11:22立陶宛
使用基本R

replace(v1 <- with(df, ave(as.character(Country), ID, FUN = toString)), duplicated(v1), NA)

#[1] "Poland, Romania, France" NA      NA    "Spain, Portugal, UK"     NA        NA    "Germany"      "Luxembourg"              "Greece"                  "Estonia, Lithuania"     
#[11] NA 

替换(v1使用
聚合
然后
匹配
仅第一次返回:

flat <- function(x) paste("Countries:", paste(x,collapse=", "))
tmp <- aggregate(Country ~ ID, data=dat, FUN=flat)
dat$Country <- NA
dat$Country[match(tmp$ID, dat$ID)] <- tmp$Country

#   ID                            Country
#1  55 Countries: Poland, Romania, France
#2  55                               <NA>
#3  55                               <NA>
#4  98     Countries: Spain, Portugal, UK
#5  98                               <NA>
#6  98                               <NA>
#7  65                 Countries: Germany
#8  67              Countries: Luxembourg
#9  84                  Countries: Greece
#10 22      Countries: Estonia, Lithuania
#11 22                               <NA>

flat带
purr
dplyr

    df %>%
    nest(-ID) %>% 
    mutate(new_name = map_chr(data, ~ paste0(.x$Country, collapse = " + "))) %>% 
    unnest()
表:

  ID new_name                  Country     
  55 Poland + Romania + France Poland    
  55 Poland + Romania + France Romania   
  55 Poland + Romania + France France    
  98 Spain + Portugal + UK     Spain     
  98 Spain + Portugal + UK     Portugal  
  98 Spain + Portugal + UK     UK        
  65 Germany                   Germany   
  67 Luxembourg                Luxembourg
  84 Greece                    Greece    
  22 Estonia + Lithuania       Estonia   
  22 Estonia + Lithuania       Lithuania 

要准确获得原始问题的结果,请添加
…mutate(new_name=paste(“国家”),paste0(Country,collapse=“+”),…
@RonakShah谢谢!!但是我怎么能在国家组开始时只添加一次
国家,而不是每次列出一个新的国家?即
国家波兰+罗马尼亚+法国
@Biostatician oops..对不起。没有注意到
国家
部分重复。更新了答案。另一种可能性:
setDT(df)[rowid(ID)=1L,nn:=df[,粘贴(Country,collapse=“+”,ID]$V1]