R根据团队名称

时间:2015-07-31 06:00:12

标签: r calculated-columns

我有一个df,其中每行代表一个人,每列代表这些人的特征。其中一列是TeamName,它是个人所属团队的名称。多个人属于一个团队。

我想在R中创建一个新列,其中包含每个团队的团队成员数量。

所以,例如我有:

df
Name    Surname     TeamName
John     Smith      Champions
Mary     Osborne    Socceroos
Mark     Johnson    Champions
Rory     Bradon     Champions
Jane     Bryant     Socceroos
Bruce    Harper     

我想

df1
Name    Surname     TeamName    TeamNo
John     Smith      Champions     3
Mary     Osborne    Socceroos     2
Mark     Johnson    Champions     3
Rory     Bradon     Champions     3  
Jane     Bryant     Socceroos     2
Bruce    Harper                   0

因为你可以看到计数包括那个人,如果有人(例如Bruce Harper)没有团队名称,那么他得到0。

我该怎么做?谢谢!

3 个答案:

答案 0 :(得分:2)

这是一个基于使用data.table的解决方案,这可能对你需要的东西来说太多了,但是在这里:

library(data.table)
dt=data.table(df)
# First, let's convert the factors of TeamName, to characters
dt[,TeamName:=as.character(TeamName)]
# Now, let find all the team numbers
dt[,TeamNo:=.N, by='TeamName']
# Let's exclude the special cases
dt[is.na(TeamName),TeamNo:=NA]
dt[TeamName=="",TeamNo:=NA]

这显然不是最好的解决方案,但我希望这有帮助

答案 1 :(得分:1)

如果您需要根据“TeamName”列了解前两列中unique个成员的数量,则n_distinct

中的一个选项为dplyr
 library(dplyr)
 library(tidyr)
 df %>%
     unite(Var, Name, Surname) %>% #paste the columns together
      group_by(TeamName) %>% #group by TeamName
      mutate(TeamNo= n_distinct(Var)) %>% #create the TeamNo column
      separate(Var, into=c('Name', 'Surname')) #split the 'Var' column

或者如果它只是每个'TeamName'的行数,我们可以按'TeamName'进行分组,使用n()获取每个组的行数,使用mutate创建'TeamNo'列基于n(),如果需要,可以使用ifelse条件为“{1}}或''的”TeamName“提供NA。

NA

或者您可以使用df %>% group_by(TeamName) %>% mutate(TeamNo = ifelse(is.na(TeamName)|TeamName=='', NA_integer_, n())) # Name Surname TeamName TeamNo #1 John Smith Champions 3 #2 Mary Osborne Socceroos 2 #3 Mark Johnson Champions 3 #4 Rory Bradon Champions 3 #5 Jane Bryant Socceroos 2 #6 Bruce Harper NA 中的ave。假设有base R'',我会先将NA转换为'',然后使用NA获取ave的'{1}} TeamNo'按该列分组。它将为{NA'值提供length。例如。

NA

答案 2 :(得分:1)

使用sqldf

library(sqldf)
sqldf("SELECT Name, Surname, TeamName, n
      FROM df 
      LEFT JOIN
      (SELECT TeamName, COUNT(Name) AS n 
      FROM df 
      WHERE NOT TeamName IS '' GROUP BY TeamName)
      USING (TeamName)")

输出:

   Name Surname  TeamName  n
1  John   Smith Champions  3
2  Mary Osborne Socceroos  2
3  Mark Johnson Champions  3
4  Rory  Bradon Champions  3
5  Jane  Bryant Socceroos  2
6 Bruce  Harper           NA