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

从R中的数据帧中获取具有多个单独观察的组级观察计数,r,dataframe,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 midfie

如何获得这样的数据帧:

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
如图所示(每个国家拥有唯一玩家的国家):

明显的复杂之处在于每个玩家都有多个观察值,所以我不能简单地通过
表格(df$country)
来获得每个国家的观察值

我一直在玩
table()
merge()
函数,但运气不好。

这里有一个方法:

as.data.frame(table(unique(d[-3])$country))
#      Var1 Freq
# 1 England    3
# 2     USA    2

删除第三列,删除所有重复的国家/地区名称对,然后统计每个国家/地区的出现次数。

不使用任何软件包,您可以执行以下操作:

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
使用类似于
数据的东西更容易。表

dt = data.table(df)
dt[,list(player_count = length(unique(soccer_player))),by=country]

下面是一个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
as.data.frame(xtabs(~ country, unique(df[1:2])), responseName = "player_count")

##   country player_count
## 1 England            2
## 2     USA            2
下面是一个基本的R解决方案:

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
as.data.frame(xtabs(~ country, unique(df[1:2])), responseName = "player_count")

##   country player_count
## 1 England            2
## 2     USA            2
提供了一个紧凑的解决方案:

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
as.data.frame(xtabs(~ country, unique(df[1:2])), responseName = "player_count")

##   country player_count
## 1 England            2
## 2     USA            2
数据:


使用
聚合
,再增加一个基本R选项:

> aggregate(soccer_player ~ country, dd, FUN = function(x) length(unique(x)))
#  country soccer_player
#1 England             3
#2     USA             2

位置不保证是唯一的。现在在R试着,但不确定这是否有效。这不是假设。好的,谢谢Matthew。我将对它进行研究,如果这个方法有效的话,它将简洁地标记为答案。非常感谢。更好的标题建议?