使用for循环在数据框中创建新列以计算R中的值?

时间:2015-07-13 22:01:00

标签: r loops

我有两个数据帧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中的总数)并将其列在新列中,但此代码不起作用。

2 个答案:

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