在R中创建迭代变量

时间:2015-11-26 23:28:28

标签: r loops iteration lapply sapply

我环顾四周,看到了一些类似于我的问题,但没有一个直接就此问题。我从1940年到2012年为各州提供了一系列总统选举结果。它们按顺序标记为r1940,d1940,r1944,d1944,r1948,d1948等。

我想创建一系列两党投票变量,这些变量的计算方法是将民主党选票的数量除以共和党和民主选票的数量。所以在df中称为投票:

d2pv1940 <- (votes$d1940/(votes$d1940+votes$r1940))

显然,我可以手动执行此操作18次,例如d2pv1944<-(votes$d1944/(votes$d1944+votes$r1944)),但显然这很费时并且会引发错误。我已经看到使用lapply或for循环的类似问题的一些解决方案,但我不确定如何迭代上述命令中的四个变量名称。

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

namest=colnames(votes)
rep=which(substr(namest, 1,1)=="r")
dem=which(substr(namest, 1,1)=="d")

res=votes[,dem]/(votes[,dem]+votes[,rep])
colnames(res)=paste("d2pv",substring(colnames(votes[,dem]),2),sep="")
res

答案 1 :(得分:0)

这是一个整洁的方法:

library(dplyr)
library(rex)

data = 
  c(1, 2, 2, 1) %>%
  setNames(
    c("r1940", "d1940", "r1944", "d1944") ) %>%
  as.list %>%
  as.data.frame

regex_1 =
  rex(capture(letter),
      capture(digits) )

abbreviations = data_frame(
  abbreviation = c("d", "r"),
  party = c("democrat", "republican") )

data %>%
  gather(variable, value) %>%
  extract(variable,
          c("abbreviation", "year"),
          regex_1) %>%
  left_join(abbreviations) %>%
  group_by(year) %>%
  mutate(total = sum(value),
         proportion = value / total ) %>%
  select(-abbreviation, -value) %>%
  spread(party, proportion)