首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R-查找州内和跨州的平均项目成员

R-查找州内和跨州的平均项目成员
EN

Stack Overflow用户
提问于 2017-07-11 03:23:55
回答 3查看 123关注 0票数 1

(此论坛上的其他问答elsewhere似乎没有处理此提要中提到的跨境问题)

假设我有以下数据:

代码语言:javascript
运行
复制
df <- data.frame(id=c("Eric", "John", "Sarah", "Simon", "Abdul", "Charlotte", "Alex", "Susan"),
             state=c("CA", "AK", "NY", "NY", "NJ", "GA", "CA", "CA"),
             project=c(1, 2, 2, 2, 3, 4, 5, 5), stringsAsFactors = F)

> df
         id state project
1      Eric    CA       1
2      John    AK       2
3     Sarah    NY       2
4     Simon    NY       2
5     Abdul    NJ       3
6 Charlotte    GA       4
7      Alex    CA       5
8     Susan    CA       5

我想要得到每个州的项目成员的平均数量,也包括跨境成员。

为了仅获得州内成员的平均值,我执行了以下操作:

代码语言:javascript
运行
复制
dfx <- data.frame()
dfy <- data.frame()
for(j in unique(df$state)){
   h <- subset(df, state==j)
   counts <- plyr::count(h, 'project')
   #uniques <- length(unique(sub$invje))
   average_members <- mean(counts$freq)
   dfx <- data.frame(state=j,
                average_members=average_members)
   dfy <- rbind(dfy, dfx)
} 

> dfy
  state average_members
1    CA             1.5
2    AK             1.0
3    NY             2.0
4    NJ             1.0
5    GA             1.0

我想要的输出,AK和NY都应该得3分,因为每个ID都与项目中的另外两个ID一起工作(尽管生活在不同的州)。

代码语言:javascript
运行
复制
> desired
  state average_members
1    CA             1.5
2    AK             3.0
3    NY             3.0
4    NJ             1.0
5    GA             1.0

有人知道如何编码吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-11 03:54:52

您可以使用dplyr库来做到这一点。您可以使用以下命令回答您的唯一状态问题

代码语言:javascript
运行
复制
library(dplyr)
df %>% count(state, project) %>% 
    group_by(state) %>% summarize(avg=mean(n))
#   state       avg
# 1    AK       1.0
# 2    CA       1.5
# 3    GA       1.0
# 4    NJ       1.0
# 5    NY       2.0

您可以使用以下命令获得跨州结果:

代码语言:javascript
运行
复制
df %>% distinct(project, state) %>% 
    inner_join(df %>% count(project)) %>% 
    group_by(state) %>% summarize(avg=mean(n))

#   state       avg
# 1    AK       3.0
# 2    CA       1.5
# 3    GA       1.0
# 4    NJ       1.0
# 5    NY       3.0
票数 2
EN

Stack Overflow用户

发布于 2017-07-11 03:39:51

代码语言:javascript
运行
复制
library(data.table)

setDT(df)
df[, .(num_proj = .N), by = .(state, project)][, .(average_members = mean(num_proj)), by = state]

结果:

代码语言:javascript
运行
复制
   state average_members
1:    CA             1.5
2:    AK             1.0
3:    NY             2.0
4:    NJ             1.0
5:    GA             1.0

对于第二种情况,在第一次迭代中将state从group by中取出。

代码语言:javascript
运行
复制
unique(df[, .(state, num_proj = .N), by = project])[, .(average_members = mean(num_proj)), by = state]

1:    CA             1.5
2:    AK             3.0
3:    NY             3.0
4:    NJ             1.0
5:    GA             1.0
票数 3
EN

Stack Overflow用户

发布于 2017-07-11 03:44:46

代码语言:javascript
运行
复制
df <- data.frame(id=c("Eric", "John", "Sarah", "Simon", "Abdul", "Charlotte", "Alex", "Susan"),
                 state=c("CA", "AK", "NY", "NY", "NJ", "GA", "CA", "CA"),
                 project=c(1, 2, 2, 2, 3, 4, 5, 5), stringsAsFactors = F)


dfx <- data.frame()
dfy <- data.frame()

for (j in unique(df$state)) {
    h = subset(df, state==j)
    thisStatesProjects = unique(h[,"project"])
    h2 = subset(df, project %in% thisStatesProjects)
    average_members = nrow(h2)/length(thisStatesProjects)
    dfx <- data.frame(state=j,
                      average_members=average_members)
    dfy <- rbind(dfy, dfx)

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45020097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档