Basic通过矩阵循环,将列名称粘贴到结果对象pt II中

时间:2014-10-02 11:08:10

标签: r

这是。的编辑版本 my initial question,我明显解释得很差,所以再次尝试。

我想对数据帧的每一列执行一个函数,并根据原始数据帧和colname命名结果对象(此处为dist类的值):

library(vegan)
d1 <- as.data.frame(matrix(rnorm(12),4,3), ncol=3, dimnames=list(NULL, LETTERS[1:3])))

Fun <-function(x){
  vegdist(decostand(x,"standardize",MARGIN=2), method="euclidean")
}
d1.A <- Fun(d1$A) # A being the colname of the first column of d1
d1.B <- Fun(d1$B)
d1.C <- Fun(d1$C)

我想在我的数据框中为超过100列做。

因此,简而言之,我想将我的函数应用于我的数据框的所有列,并创建结果值,其名称由原始数据框的名称和函数正在处理的列名称粘贴。

非常感谢!

2 个答案:

答案 0 :(得分:1)

如果您希望使用大量对象来混乱您的全局环境,则可以使用list2envassign,但您可以使用list(但我不建议这样做)。相反,您可以将所有操作/分析存储在write.table中,然后使用lapply lst <- setNames(lapply(d1, Fun), paste("d1", colnames(d1), sep=".")) 保存/写入不同的文件来执行所有操作/分析

list

上述 list2env(lst, envir=.GlobalEnv) #<environment: R_GlobalEnv> 可用于大部分分析。如果你需要作为单独的对象。

d1.A

现在,您可以通过调用d1.B d1.A # 1 2 3 #2 1.9838499 #3 1.2754209 0.7084290 #4 2.2286961 0.2448462 0.9532752 等来获取单个对象。

{{1}}

答案 1 :(得分:0)

我假设你需要创建一个数字(等于d1的列数)的类#34; dist&#34;。

如果是这种情况,您可以这样做:

for (i in 1:ncol(d1))
{
  eval(parse(text=paste('d1.',colnames(d1)[i], "<-" ,"Fun(d1[,",i,"])", sep=""))) 
}

这在每次迭代中评估为:

 d1.V1 <- Fun(d1$V1)
 d1.V2 <- Fun(d1$V2)
 d1.V3 <- Fun(d1$V3)