我有一個資料框,其中每一行代表一個人,列代表他們過去的名字。某些值是 NA 或重復值。資料看起來像下面的資料框。
| 姓名 | 名稱1 | 名稱2 | 名稱3 | 名稱4 |
|---|---|---|---|---|
| 湯姆 | 湯姆 | 托馬斯 | 湯姆 | 湯米 |
| 吉姆 | 不適用 | 詹姆士 | 不適用 | 吉米 |
| 戴夫 | 戴夫 | 大衛 | 不適用 | 戴維 |
| 蒂姆 | 不適用 | 提摩太 | 蒂姆 | 蒂米 |
| 搶 | 搶 | 不適用 | 搶 | 羅比 |
| 山姆 | 不適用 | 不適用 | 山姆 | 不適用 |
我想組合每一行的唯一名稱并將它們放入一個新列中,其中每個名稱只出現一次。我知道我可以使用粘貼函式來生成一個列,其中所有文本值都顯示如下:
| 姓名 | 名稱1 | 名稱2 | 名稱3 | 名稱4 | 獨特 |
|---|---|---|---|---|---|
| 湯姆 | 湯姆 | 托馬斯 | 不適用 | 湯米 | 湯姆,湯姆,托馬斯,北美,湯米 |
但我不希望相同的文本在唯一列中多次出現。如何組合行資料以使每個名稱僅在新的 $unique 單元格中出現一次?
| 姓名 | 名稱1 | 名稱2 | 名稱3 | 名稱4 | 獨特 |
|---|---|---|---|---|---|
| 湯姆 | 湯姆 | 托馬斯 | 湯姆 | 湯米 | 湯姆,托馬斯,湯米 |
| 吉姆 | 不適用 | 詹姆士 | 不適用 | 吉米 | 吉姆,詹姆斯,吉米 |
| 戴夫 | 戴夫 | 大衛 | 不適用 | 戴維 | 戴夫,戴維,戴維 |
| 蒂姆 | 不適用 | 提摩太 | 蒂姆 | 蒂米 | 蒂姆,蒂莫西,蒂米 |
| 搶 | 搶 | 不適用 | 搶 | 羅比 | 羅伯,羅伯特,羅比 |
| 山姆 | 不適用 | 不適用 | 山姆 | 不適用 | 山姆 |
任何幫助將不勝感激。
uj5u.com熱心網友回復:
使用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
uj5u.com熱心網友回復:
apply按unique行排列,na.omit然后折疊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
如果您愿意,您還可以實作 a 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))
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/468518.html
