如何获得这样的数据框:
soccer_player country position
"sam" USA left defender
"jon" USA right defender
"sam" USA left midfielder
"jon" USA offender
"bob" England goalie
"julie" England central midfielder
"jane" England goalie
看起来像这样(每个国家/地区拥有独特玩家数量的国家/地区):
country player_count
USA 2
England 3
显而易见的复杂因素是每个玩家有多个观察结果,所以我不能简单地table(df$country)
来获得每个国家的观察数量。
我一直在使用table()
和merge()
功能,但没有运气。
答案 0 :(得分:7)
new features of dplyr v 3.0提供了一个紧凑的解决方案:
数据:
dd <- read.csv(text='
soccer_player,country,position
"sam",USA,left defender
"jon",USA,right defender
"sam",USA,left midfielder
"jon",USA,offender
"bob",England,goalie
"julie",England,central midfielder
"jane",England,goalie')
代码:
library(dplyr)
dd %>% distinct(soccer_player,country) %>%
count(country)
答案 1 :(得分:6)
这是一种方式:
as.data.frame(table(unique(d[-3])$country))
# Var1 Freq
# 1 England 3
# 2 USA 2
删除第三列,删除任何重复的国家/地区名称对,然后计算每个国家/地区的出现次数。
答案 2 :(得分:6)
不使用任何套餐,您可以这样做:
List = by(df, df$country, function(x) length(unique(x$soccer_player)))
DataFrame = do.call(rbind, lapply(names(List), function(x)
data.frame(country=x, player_count=List[[x]])))
# country player_count
#1 England 2
#2 USA 2
使用data.table
:
dt = data.table(df)
dt[,list(player_count = length(unique(soccer_player))),by=country]
答案 3 :(得分:3)
这是一个sqldf解决方案:
library(sqldf)
sqldf("select country, count(distinct soccer_player) player_count
from df
group by country")
## country player_count
## 1 England 2
## 2 USA 2
这是基础R解决方案:
as.data.frame(xtabs(~ country, unique(df[1:2])), responseName = "player_count")
## country player_count
## 1 England 2
## 2 USA 2
答案 4 :(得分:1)
另一个基本R选项,使用aggregate
:
> aggregate(soccer_player ~ country, dd, FUN = function(x) length(unique(x)))
# country soccer_player
#1 England 3
#2 USA 2