R将DF中的列与字符串组合,并根据特定的列顺序按字母顺序对它们进行排序
我有一个dataframe,它有4列,指定两个人的名字和姓氏:R将DF中的列与字符串组合,并根据特定的列顺序按字母顺序对它们进行排序,r,alphabetical,R,Alphabetical,我有一个dataframe,它有4列,指定两个人的名字和姓氏: Surname Firstname Surname2 Firstname2 1 Wolf Stefan Schmit Paul 2 Schmit Paul Wolf Stefan 3 Schmit Paul Fore Sabine 4 Fore Sabine Schmit Hans 5 Sch
Surname Firstname Surname2 Firstname2
1 Wolf Stefan Schmit Paul
2 Schmit Paul Wolf Stefan
3 Schmit Paul Fore Sabine
4 Fore Sabine Schmit Hans
5 Schmit Hans Wolf Stefan
6 Schmit Paul Schmit Hans
7 Bracht Armin Brecht Alwin
8 Brecht Alwin Bracht Armin
现在我想增加第五列,根据姓氏按字母顺序对这两个人进行分组,但如果这是相同的,那么根据名字。。。在新的第五列中,两个人都应该是,先是名字,然后是姓氏,用逗号f.e分隔:
Surname Firstname Surname2 Firstname2 Team
1 Wolf Stefan Schmit Paul Paul Schmit , Stefan Wolf
2 Schmit Paul Wolf Stefan Paul Schmit , Stefan Wolf
3 Schmit Paul Fore Sabine Sabine Fore , Paul Schmit
4 Fore Sabine Schmit Hans Sabine Fore , Hans Schmit
5 Schmit Hans Wolf Stefan Hans Schmit , Stefan Wolf
6 Schmit Paul Schmit Hans Hans Schmit , Paul Schmit
7 Bracht Armin Brecht Alwin Armin Bracht , Alwin Brecht
8 Brecht Alwin Bracht Armin Armin Bracht , Alwin Brecht
我有一个基于for循环的工作代码,但我想为更大的数据帧寻找一个更有效的版本,并且使用起来更舒适,因为每个名称的单个列可能超过2
# Simple Code:
Surname <- c("Wolf", "Schmit", "Schmit", "Fore", "Schmit", "Schmit", "Bracht", "Brecht")
Firstname <- c("Stefan", "Paul", "Paul", "Sabine", "Hans", "Paul", "Armin", "Alwin")
Surname2 <- c("Schmit", "Wolf", "Fore", "Schmit", "Wolf", "Schmit", "Brecht", "Bracht")
Firstname2 <- c("Paul", "Stefan", "Sabine", "Hans", "Stefan", "Hans", "Alwin", "Armin")
library(reshape2)
tester <- melt(data.frame(Surname, Firstname, Surname2, Firstname2))
tester[] <- lapply(tester, as.character)
tester
namescomp <- function(data, i){
if (data[i, "Surname"] < data[i, "Surname2"]){
paste(data[i, "Firstname"], data[i, "Surname"], ", ", data[i, "Firstname2"], data[i, "Surname2"])
} else if (data[i, "Surname"] > data[i, "Surname2"]){
paste(data[i, "Firstname2"], data[i, "Surname2"], ", ", data[i, "Firstname"], data[i, "Surname"])
} else
{ if(data[i, "Firstname"] < data[i, "Firstname2"]){
paste(data[i, "Firstname"], data[i, "Surname"], ", ", data [i, "Firstname2"], data[i, "Surname2"])
} else {
paste(data[i, "Firstname2"], data[i, "Surname2"], ", ", data[i, "Firstname"], data[i, "Surname"])
}
}
}
for(y in 1:nrow(tester)){
i <- y
tester[i, "Team"] <- namescomp(tester, i)
}
tester
#简单代码:
姓氏Atidyverse
解决方案:
library(tibble)
library(dplyr)
library(tidyr)
library(stringr)
Surname <- c("Wolf", "Schmit", "Schmit", "Fore", "Schmit", "Schmit", "Bracht", "Brecht")
Firstname <- c("Stefan", "Paul", "Paul", "Sabine", "Hans", "Paul", "Armin", "Alwin")
Surname2 <- c("Schmit", "Wolf", "Fore", "Schmit", "Wolf", "Schmit", "Brecht", "Bracht")
Firstname2 <- c("Paul", "Stefan", "Sabine", "Hans", "Stefan", "Hans", "Alwin", "Armin")
df <- data_frame(Surname, Firstname, Surname2, Firstname2)
df %>%
# create an identifier for each team
rownames_to_column(var = 'team_id') %>%
# split all name components into separate rows
gather(component, value, -team_id) %>%
# extract a person_id from the number behind first/last name. If there's no number there, use 1
mutate(person_id = coalesce(as.numeric(str_extract(component, '[0-9]+$')), 1)) %>%
# remove the number from the first/last name, then pivot the data.frame so that there's a row for every team x person
mutate(component = str_replace(component, '[0-9]+$', '')) %>%
spread(component, value) %>%
# order by team_id (not strictly necessary), then by Surname, then by Firstname (if you want the order reversed, wrap the variable in `desc()`)
arrange(team_id, Surname, Firstname) %>%
# collapse Surname and Firstname into a `full_name` column
unite(full_name, Firstname, Surname, sep = ' ') %>%
# collapse the full names within each team into a single line, separated by commas
group_by(team_id) %>%
summarize(Team = paste(full_name, collapse=', '))
库(TIBLE)
图书馆(dplyr)
图书馆(tidyr)
图书馆(stringr)
姓%
价差(成分、价值)%>%
#按team_id排序(严格来说不是必需的),然后按姓氏,然后按Firstname排序(如果要颠倒顺序,请将变量包装在'desc()`)
安排(团队id、姓氏、名字)%>%
#将姓氏和名字折叠成“全名”列
unite(全名、名、姓、sep='')%>%
#将每个团队的全名折叠成一行,用逗号分隔
组员(组别id)%>%
总结(团队=粘贴(全名,折叠=','))
不完全生成所需的输出,但您可以将其生成的内容加入到行名的原始表中。您希望排序依赖于Lastname
,但Lastname
在您的数据中不显示。抱歉:我指的是姓氏(将在上面进行编辑)