在 R 中创建迭代变量

Creating Iterated Variables in R

我环顾四周,发现了一些与我类似的问题,但 none 切中要害。我有一系列从 1940 年到 2012 年各州的总统选举结果。它们按顺序标记为 r1940、d1940、r1944、d1944、r1948、d1948 等等。

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

的 df 中
d2pv1940 <- (votes$d1940/(votes$d1940+votes$r1940))

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

尝试这样的事情:

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

这是一个简洁的方法:

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)