【问题标题】:In R, how do I use apply() with data frames?在 R 中,如何将 apply() 与数据框一起使用?
【发布时间】:2016-10-02 16:47:05
【问题描述】:

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

但 apply 仅适用于矩阵。

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

这不适用于数据帧,仅适用于矩阵

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

【问题讨论】:

  • 你似乎只想要do.call(paste, c(df[1:3], sep = "."))。而且您不应该尝试在数据帧上使用apply()。它适用于矩阵,在数据帧上使用它几乎总是会产生意想不到的结果。
  • Richard,这是一个很好的方法,但我认为 do.call 解析器对列表的成员,在这种情况下是列。可以修改为逐行执行此操作吗?
  • @RichScriven 最好的选择是什么?

标签: r dataframe lapply sapply


【解决方案1】:

您可以排除非数字列/行并将应用功能部署到数字行。

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

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

【讨论】:

    【解决方案2】:

    首先,请注意这不是列的问题。 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)])
    

    【讨论】:

    • (已删除评论的已删除答案)
    • 小心。转置数据帧通常是一个坏主意——这不会保留原始数据的类别。此外,您可以轻松地使用lapply() 来索引行。例如这样的:lapply(1:3, function(i){ paste(df[i, 1:3], sep = ".") } )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多