R - 按顺序使用现有列名动态创建列
R - dynamically create columns using existing column names in sequence
我有一个数据框,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_2002
、df$rev_2003
...df$rev_2020
或 x
变量最后四个字符的最大值(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
我有一个数据框,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_2002
、df$rev_2003
...df$rev_2020
或 x
变量最后四个字符的最大值(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