基于其他行和其他行创建新变量的标准方法

时间:2019-09-06 17:40:19

标签: r

我知道创建新变量的方法,但是哪一个最遵循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中的解决方案感兴趣。

1 个答案:

答案 0 :(得分:2)

看看lead()中的lag()dplyr

这是做你想要做的事情的一种方法

library(dplyr)
our.data.frame %>% 
  arrange(Year, Country) %>%
  group_by(Country) %>% 
  mutate(NewVar = Value + lead(Value))