向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]