【问题标题】:Function to perform similar calculations on variables with similar names对具有相似名称的变量执行相似计算的函数
【发布时间】:2018-02-08 12:39:14
【问题描述】:

我有一个看起来像这样的数据框

var1<-c(150,20,30)
var2<-c(20,30,40)
x<-c(2.5,4.5,7.5)
s_var1<-c(0,0,0)
s_var2<-c(0,0,0)

data<-data.frame(var1, var2, x, s_var1, s_var2)

可能有一大堆“var”列 - var1、var2....var'n'。与 s_var1、s_var2 ......等相同。

我想编写一个函数,它在引用“var”列和“x”列的同时对“s_var”列进行计算。

例如:如果有 2 个 'var' 列

n_var<-c(1,2)

for (i in n_var)
{
if (x > 2.5) { s_var[i] = var[i] } else {s_var[i] = 2*var[i]}
}

有什么建议吗?我正在努力将列表中的数字作为引用列名的后缀传递...

【问题讨论】:

  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 为什么还要创建s_var1s_var2?像cbind(df, setNames(data.frame(sapply(df[grepl('var' ,names(df))], function(i) ifelse(df$x &gt; 2.5, i, 2*i))), paste0('s_', names(df)[grepl('var', names(df))]))) 这样的东西应该可以正常工作。
  • paste()之后使用get()构造变量名

标签: r dataframe apply


【解决方案1】:

使用grep 查找vars_var 列的列索引,并定义一个依赖于xmultiplier。最后应用乘数。请注意,乘数将被回收以乘以data[var_cols] 中的每一列。

fun <- function(data) {
  var_cols <- grep("^var", names(data))
  s_var_cols <- grep("^s_var", names(data))
  multiplier <- (x > 2.5) + 1
  data[s_var_cols] <- multiplier * data[var_cols]  ##
  data
}

fun(data)

给予:

  var1 var2   x s_var1 s_var2
1  150   20 2.5    150     20
2   20   30 4.5     40     60
3   30   40 7.5     60     80

上面的## 行也可以这样写,这里不需要,但如果计算更复杂,则可能需要使用lapplymapply

data[s_var_cols] <- lapply(data[var_cols], `*`, multiplier)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2018-08-12
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多