从R中的数据框中获取具有多个单独观察的组级观察计数

时间:2014-10-13 17:00:17

标签: r dataframe

如何获得这样的数据框:

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()功能,但没有运气。

5 个答案:

答案 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