我有一个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。
我该怎么做?谢谢!
答案 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