在R中,如何对数据帧使用apply()?

时间:2016-06-02 19:23:35

标签: r dataframe lapply sapply

apply()允许您分别选择MARGIN = 1或MARGIN = 2的行或列。

但仅适用于矩阵。

例如,我有三行标题信息和3列描述性信息。我需要分别将它们组合成行名,行名和列名。所以我不能轻易使用read.table()并跳过前3行,然后删除前3列以立即获取我的矩阵。

这不适用于数据框,只适用于矩阵

rownames(df)<-apply(df[,1:3], MARGIN=1,FUN=function(x){paste(x,sep=".")})

2 个答案:

答案 0 :(得分:1)

您可以排除非数字列/行,并将apply函数部署到数字行。

考虑一个例子: 如果数据框有4列,其中第一列属于字符类,则使用下面的代码:

apply(Data.df[,2:4],2,func_name)

答案 1 :(得分:0)

首先,请注意这不是列的问题。 lapply会毫无困难地完成列

colnames(df) <- lapply(df[1:3,], function(x) {paste(x,sep=".")})

找到了rsoren的一个很好的答案here)。针对此问题进行了修改:

for (row in 1:nrow(df)) { 
    rownames(df)[row] <- paste(df[row,1:3],sep=".") 
}

你不能用lapply做行。这是一种替代的,更直观的方法。要对行进行操作,我们首先进行转置;现在行是列,lapply可以对列进行操作。

tdf<-as.data.frame(t(df))
rownames(df) <- lapply(tdf[1:3,], function(x) {paste(x,sep=".")})

唯一的缺点是R在转置期间制作了表的副本,因此它使内存使用量翻倍。但是,rsoren的方法没有。

现在我可以删除额外的行和列,并使用正确的行名和列名创建我想要的矩阵。

myMatrix <- as.matrix(df[-(1:3),-(1:3)])