微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R - 按顺序使用现有列名动态创建列

如何解决R - 按顺序使用现有列名动态创建列

我有一个数据框 df,其中有几列。我想创建一个函数来使用现有列名动态创建新列。其中一部分是使用现有列名的最后四个字符。例如,我想像这样创建一个变量名称 df$rev_2002

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

问题是我希望能够在每次将新列(例如 df$avg_2003)附加到数据帧时运行该函数

为此,我使用了以下函数提取 df$avg_2002 变量的最后 4 个字符:

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

我尝试组合另一个函数来创建列:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。