我有两个数据帧df1和df2:
group=c("Group 1", "Group 2", "Group3","Group 1", "Group 2", "Group3")
year=c("2000","2000","2000", "2015", "2015", "2015")
items=c("12", "10", "15", "5", "10", "7")
df1=data.frame(group, year, items)
year=c("2000", "2015")
items=c("37", "22")
df2=data.frame(year,items)
df1包含每年的项目数并按组分隔,df2包含每年的项目总数
我正在尝试创建一个for循环,用于计算每个组类型的项目比例。 我正在尝试做类似的事情:
df1$Prop="" #create empty column called Prop in df1
for(i in 1:nrow(df1)){
df1$Prop[i]=df1$items/df2$items[df2$year==df1$year[i]]
}
其中循环应该得到每种类型项目的比例(通过从df1获取值并除以df2中的总数)并将其列在新列中,但此代码不起作用。
答案 0 :(得分:4)
您真的不需要df2
,这里是一个使用data.table
的简单解决方案而且只有df1
(我的{im} items
是数字列,如果没有,您需要将其转换为一个setDT(df1)[, items := as.numeric(as.character(items))]
)
library(data.table)
setDT(df1)[, Prop := items/sum(items), by = year]
df1
# group year items Prop
# 1: Group 1 2000 12 0.3243243
# 2: Group 2 2000 10 0.2702703
# 3: Group3 2000 15 0.4054054
# 4: Group 1 2015 5 0.2272727
# 5: Group 2 2015 10 0.4545455
# 6: Group3 2015 7 0.3181818
另一种方法是,如果您已经拥有df2
,则可以在两者之间加入并计算Prop
这样做(同样,我假设items
是真实的数字数据)
setkey(setDT(df1), year)[df2, Prop := items/i.items]
基础R替代
with(df1, ave(items, year, FUN = function(x) x/sum(x)))
## [1] 0.3243243 0.2702703 0.4054054 0.2272727 0.4545455 0.3181818
答案 1 :(得分:2)
dplyr
相当于David的data.table
解决方案
library(dplyr)
df1$items = as.integer(as.vector(df1$items))
df1 %>% group_by(year) %>% mutate(Prop = items / sum(items))
#Source: local data frame [6 x 4]
#Groups: year
# group year items Prop
#1 Group 1 2000 12 0.3243243
#2 Group 2 2000 10 0.2702703
#3 Group3 2000 15 0.4054054
#4 Group 1 2015 5 0.2272727
#5 Group 2 2015 10 0.4545455
#6 Group3 2015 7 0.3181818
plyr
替代
ddply(df1, .(year), mutate, prop = items/sum(items))
lapply
替代
do.call(rbind,lapply(split(df1, df1$year),
function(x){ x$prop = x$item / sum(x$item); x}))