簡體   English   中英

R - 使用現有列名按順序動態創建列

[英]R - dynamically create columns using existing column names in sequence

我有一個 dataframe, df ,其中有幾列。 我想創建一個 function 以使用現有列名動態創建新列。 其中一部分是使用現有列名的最后四個字符。 例如,我想創建一個變量名df$rev_2002 ,如下所示:

df$rev_2002 <- df$avg_2002 * df$quantity

問題是我希望能夠在每次將新列(例如df$avg_2003 )附加到 dataframe 時運行 function。

為此,我使用了以下 function 來提取df$avg_2002變量的最后 4 個字符:

substRight <- function (x,n) {
  substr(x, nchar(x)-n+1, nchar(x))
}

我嘗試將另一個 function 放在一起來創建列:

revved <- function(x, y, z){
  z = x * y
  names(z) <- paste('revenue', substRight(x,4), sep = "_")
  return x
}

但是,當我對實際數據進行嘗試時,我的df中沒有新列。 所需的結果是我的df中的一系列變量,例如:

df$rev_2002df$rev_2003 ... df$rev_2020x變量最后四個字符的最大值(上面示例中的df$avg_2002 )。

任何幫助或建議將不勝感激。 我真的在這里的樹林里。

dat <- data.frame(id = 1:2, quantity = 3:4, avg_2002 = 5:6, avg_2003 = 7:8, avg_2020 = 9:10)
func <- function(dat, overwrite = FALSE) {
  nms <- grep("avg_[0-9]+$", names(dat), value = TRUE)
  revnms <- gsub("avg_", "rev_", nms)
  if (!overwrite) revnms <- setdiff(revnms, names(dat))
  dat[,revnms] <- lapply(dat[,nms], `*`, dat$quantity)
  dat
}

func(dat)
#   id quantity avg_2002 avg_2003 avg_2020 rev_2002 rev_2003 rev_2020
# 1  1        3        5        7        9       15       21       27
# 2  2        4        6        8       10       24       32       40

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM