在 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)
我环顾四周,发现了一些与我类似的问题,但 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)