![](/img/trans.png)
[英]in R choosing specific values from two rows sharing unique ids but keeping only one row
[英]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.