我知道创建新变量的方法,但是哪一个最遵循R逻辑?
我通常使用循环,因为它最容易编写,但可能比其他方法慢。
countries <- c("USA", "GER", "POL", "UK")
years <- c(2014, 2015, 2016, 2017, 2018, 2019)
var.value <- runif(length(countries) * length(years), min = 1, max = 100)
our.data.frame <- merge(countries, years, all = TRUE)
our.data.frame <- cbind(our.data.frame, var.value)
colnames(our.data.frame) <- c("Country", "Year", "Value")
# Suppose we want to write a variable which takes sum of "Value"
# for the given and the next year, for the given country
produce.new.var <- function(our.data.frame) {
new.var <- numeric(0)
for(i in 1:nrow(our.data.frame)) {
next.year.i <- which(
our.data.frame$Country == our.data.frame$Country[i]
& our.data.frame$Year == our.data.frame$Year[i] + 1
)
if(length(next.year.i) == 0) {
new.var[i] <- our.data.frame$Value[i]
} else {
new.var[i] <- our.data.frame$Value[i] + our.data.frame$Value[next.year.i]
}
}
new.var
}
our.data.frame <- cbind(our.data.frame, NewVar = produce.new.var(our.data.frame))
这也很酷,因为新变量按正确顺序生成,因此绑定非常舒适。但是我觉得我应该使用一些矢量化或至少使用which()...来实现,但是然后我觉得编写它并将新变量粘贴到数据帧并不简单。我肯定会丢失一些东西。
顺便说一句,我通常处理大量数据,行数在1k和1kk之间,通常约10-30列。可能很重要。
编辑: 我对没有(例如)dplyr的R中的解决方案感兴趣。
答案 0 :(得分:2)
看看lead()
中的lag()
和dplyr
这是做你想要做的事情的一种方法
library(dplyr)
our.data.frame %>%
arrange(Year, Country) %>%
group_by(Country) %>%
mutate(NewVar = Value + lead(Value))