首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于因子求和为R data.frame创建新变量

基于因子求和为R data.frame创建新变量
EN

Stack Overflow用户
提问于 2013-09-03 17:03:42
回答 2查看 234关注 0票数 2

我有以下表格的R数据:

代码语言:javascript
复制
FIRM   WORKER HOURS
FIRM1  A1     H1
FIRM1  A2     H2
FIRM1  A3     H3
FIRM1  B1     H4
FIRM1  B2     H5 
FIRM2  A1     H6
FIRM2  C1     H7

有些公司拥有不同教育类别的工人(A、B、C、.)。我想对数据进行转换,这样教育类别就可以总结成一个列,所有的公司都只有一行。因此,我需要将初始数据转换为以下形式:

代码语言:javascript
复制
FIRM   HOURS_A   HOURS_B HOURS_C
FIRM1  H1+H2+H3  H4+H5  
FIRM2  H6                H7

做这件事最整洁的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-03 17:15:47

先聚合,然后重塑:

数据:

代码语言:javascript
复制
x <- read.table(header=TRUE, text="
FIRM   WORKER HOURS
FIRM1  A1     1
FIRM1  A2     2
FIRM1  A3     3
FIRM1  B1     4
FIRM1  B2     5 
FIRM2  A1     6
FIRM2  C1     7
")

代码:

代码语言:javascript
复制
tmp <- aggregate(HOURS~FIRM+WORK, data=within(x, WORK <- substr(WORKER,1,1)), sum)

reshape(tmp, idvar="FIRM", timevar="WORK", direction="wide")

结果:

代码语言:javascript
复制
   FIRM HOURS.A HOURS.B HOURS.C
1 FIRM1       6       9      NA
2 FIRM2       6      NA       7
票数 2
EN

Stack Overflow用户

发布于 2013-09-03 17:17:49

我假设您的意思是您实际上想要对某些值进行求和,并且您的data.frame看起来如下所示:

代码语言:javascript
复制
mydf <- structure(
  list(FIRM = c("FIRM1", "FIRM1", "FIRM1", "FIRM1", "FIRM1", "FIRM2", "FIRM2"), 
       WORKER = c("A", "A", "A", "B", "B", "A", "C"), 
       HOURS = c(10L, 20L, 15L, 13L, 12L, 9L, 16L)), 
  .Names = c("FIRM", "WORKER", "HOURS"), 
  class = "data.frame", row.names = c(NA, -7L))
mydf
#    FIRM WORKER HOURS
# 1 FIRM1      A    10
# 2 FIRM1      A    20
# 3 FIRM1      A    15
# 4 FIRM1      B    13
# 5 FIRM1      B    12
# 6 FIRM2      A     9
# 7 FIRM2      C    16

然后,您可以使用xtabs

代码语言:javascript
复制
xtabs(HOURS ~ FIRM + WORKER, mydf)
#        WORKER
# FIRM     A  B  C
#   FIRM1 45 25  0
#   FIRM2  9  0 16

或者,您可以对数据集进行melt并使用dcast对其进行整形。

代码语言:javascript
复制
library(reshape2)
dfL <- melt(mydf, id.vars=c("FIRM", "WORKER"))
dcast(dfL, FIRM ~ variable + WORKER, fun.aggregate=sum, value.var="value")
#    FIRM HOURS_A HOURS_B HOURS_C
# 1 FIRM1      45      25       0
# 2 FIRM2       9       0      16
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18597739

复制
相关文章

相似问题

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