繁体   English   中英

如何粘贴 dataframe 行中的文本,仅保留 R 中的唯一值

[英]How can I paste text from dataframe rows, keeping only unique values in R

我有一个 dataframe,其中每一行代表一个人,列代表他们的名字。 一些值是 NA 或重复的。 数据看起来像下面的 dataframe。

名称 姓名1 名字2 名字3 姓名4
汤姆 汤姆 托马斯 汤姆 汤米
吉姆 北美 詹姆士 北美 吉米
戴夫 戴夫 大卫 北美 戴维
蒂姆 北美 蒂莫西 蒂姆 提米
北美 罗比
山姆 北美 北美 山姆 北美

我想合并每一行的唯一名称并将它们放入一个新列中,每个名称只出现一次。 我知道我可以使用粘贴 function 来生成一列,其中所有文本值如下所示:

名称 姓名1 名字2 名字3 姓名4 独特
汤姆 汤姆 托马斯 北美 汤米 汤姆,汤姆,托马斯,NA,汤米

但我不希望相同的文本在唯一列中出现多次。 如何合并行数据,使每个名称在新的 $unique 单元格中只出现一次?

名称 姓名1 名字2 名字3 姓名4 独特
汤姆 汤姆 托马斯 汤姆 汤米 汤姆,托马斯,汤米
吉姆 北美 詹姆士 北美 吉米 吉姆,詹姆斯,吉米
戴夫 戴夫 大卫 北美 戴维 戴夫,大卫,戴夫
蒂姆 北美 蒂莫西 蒂姆 提米 蒂姆,蒂莫西,蒂米
北美 罗比 罗伯,罗伯特,罗比
山姆 北美 北美 山姆 北美 山姆

使用tidyverse

library(dplyr)
df1 %>% 
 rowwise %>% 
  mutate(unique = toString(unique(na.omit(c_across(everything()))))) %>% 
  ungroup

-输出

# A tibble: 6 × 6
  Name  Name1 Name2   Name3 Name4 unique             
  <chr> <chr> <chr>   <chr> <chr> <chr>              
1 Tom   Tom   Thomas  Tom   Tommy Tom, Thomas, Tommy 
2 Jim   <NA>  James   <NA>  Jimmy Jim, James, Jimmy  
3 Dave  Dave  David   <NA>  Davey Dave, David, Davey 
4 Tim   <NA>  Timothy Tim   Timmy Tim, Timothy, Timmy
5 Rob   Rob   <NA>    Rob   Robby Rob, Robby         
6 Sam   <NA>  <NA>    Sam   <NA>  Sam       

apply ing unique row-wise, na.omit和 collapse toString

transform(dat, unique=apply(dat, 1, \(x) toString(na.omit(unique(x)))))
#   Name Name1   Name2 Name3 Name4              unique
# 1  Tom   Tom  Thomas   Tom Tommy  Tom, Thomas, Tommy
# 2  Jim  <NA>   James  <NA> Jimmy   Jim, James, Jimmy
# 3 Dave  Dave   David  <NA> Davey  Dave, David, Davey
# 4  Tim  <NA> Timothy   Tim Timmy Tim, Timothy, Timmy
# 5  Rob   Rob    <NA>   Rob Robby          Rob, Robby
# 6  Sam  <NA>    <NA>   Sam  <NA>                 Sam

如果愿意,您还可以实施sort


数据:

dat <- structure(list(Name = c("Tom", "Jim", "Dave", "Tim", "Rob", "Sam"
), Name1 = c("Tom", NA, "Dave", NA, "Rob", NA), Name2 = c("Thomas", 
"James", "David", "Timothy", NA, NA), Name3 = c("Tom", NA, NA, 
"Tim", "Rob", "Sam"), Name4 = c("Tommy", "Jimmy", "Davey", "Timmy", 
"Robby", NA)), class = "data.frame", row.names = c(NA, -6L))
df%>%
 rowid_to_column()%>%
 left_join(pivot_longer(.,-rowid)%>%
 group_by(rowid)%>%    
 summarise(value=toString(na.omit(unique(value))), .groups = 'drop'))
  rowid Name Name1   Name2 Name3 Name4               value
1     1  Tom   Tom  Thomas   Tom Tommy  Tom, Thomas, Tommy
2     2  Jim  <NA>   James  <NA> Jimmy   Jim, James, Jimmy
3     3 Dave  Dave   David  <NA> Davey  Dave, David, Davey
4     4  Tim  <NA> Timothy   Tim Timmy Tim, Timothy, Timmy
5     5  Rob   Rob    <NA>   Rob Robby          Rob, Robby
6     6  Sam  <NA>    <NA>   Sam  <NA>                 Sam

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM