在 r 应用中打印列名并另存为数据框上的新列

Print column name in an r apply and save as new column on a dataframe

我写了一个应用程序,我想 'loop' 在数据框中的一部分列上打印一些输出。举个例子,我只是根据一列除以另一列进行转换(我知道还有其他方法可以做到这一点)所以我们有:

apply(df[c("a","b","c")],2,function(x){
z <- a/df[c("divisor")]
    }
)

我想打印当前正在操作的列名,但是 colnames(x)(例如)不起作用。

然后我想根据每个列名(a.exp、b.exp 或其他)将一个新列保存到同一个 df 中。

我想很多人都会寻找同样的问题,所以我正在回答我自己的问题(最终找到了答案)。如下所示,这两个部分都有其他答案(谢谢!),但没有将这些问题结合起来(并且一些示例更复杂)。

首先,"colnames" 元素似乎真的不是你可以绕过的东西(我觉得很奇怪!),所以你 'loop' 在列名上,在函数调用中实际向量 名称 [c(x)].

然后关键是分配,所以创建新列,在应用中,使用 '<<'

apply(colnames(df[c("a","b","c")]),function(x) {
z <- (ChISEQCIS[c(paste0(x))]/ChISEQCIS[c("V1")])
ChISEQCIS[c(paste0(x,"ind"))] <<- z
}
)

讨论了 <<,例如

我很困惑,因为我最初只是模糊地想过要保存输出,我想我需要两个列(我错误地假设应用像循环一样工作,所以我可以使用计数器作为索引或其他东西)和应该有相同的方法来分别获取名称(例如 colname(x))。

有几个相关的堆栈问题:

  • (最容易理解)

例如,取

df <- data.frame(a = 1:3, b = 11:13, c = 21:23)

I'd like to print the column name currently being operated on, but colnames(x) (for example) doesn't work.

对列索引使用 sapply

sapply(seq_len(ncol(df)), function(x) names(df)[x])
# [1] "a" "b" "c"

I want to save a new column, based on each colname (a.exp,b.exp or whatever) into the same df.

这是一种方法:

(df <- cbind(df, setNames(as.data.frame(apply(df, 2, "^", 2)), paste(names(df), "sqr", sep = "."))))
#   a  b  c a.sqr b.sqr c.sqr
# 1 1 11 21     1   121   441
# 2 2 12 22     4   144   484
# 3 3 13 23     9   169   529