Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R将DF中的列与字符串组合,并根据特定的列顺序按字母顺序对它们进行排序_R_Alphabetical - Fatal编程技术网

R将DF中的列与字符串组合,并根据特定的列顺序按字母顺序对它们进行排序

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

我有一个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  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
#简单代码:

姓氏A
tidyverse
解决方案:

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
在您的数据中不显示。抱歉:我指的是姓氏(将在上面进行编辑)