【问题标题】:R: Apply function on specific columns preserving the rest of the dataframeR:在保留数据框的其余部分的特定列上应用函数
【发布时间】:2012-11-15 13:00:05
【问题描述】:

我想了解如何在我的数据框的特定列上应用函数,而不是从我的 df.xml 中“排除”其他列。例如,我想将某些特定列乘以 1000,而其他列则保持原样。

像这样使用 sapply 函数:

    a<-as.data.frame(sapply(table.xy[,1], function(x){x*1000}))

我得到了第一列乘以 1000 的新数据框,但没有我在操作中未使用的其他列。所以我的尝试是这样做:

    a<-as.data.frame(sapply(table.xy, function(x) if (colnames=="columnA") {x/1000} else {x}))

但是这个没有用。

我的解决方法是为两个数据框提供另一行 ID,然后将旧数据框与新创建的数据框合并以获得完整的数据框。但我认为必须有更好的解决方案。不是吗?

【问题讨论】:

    标签: r dataframe sapply


    【解决方案1】:

    如果您只想对一列或几列进行计算,您可以使用transform 或手动对其进行索引:

    # with transfrom:
    df <- data.frame(A = 1:10, B = 1:10)
    df <- transform(df, A = A*1000)
    
    # Manually:
    df <- data.frame(A = 1:10, B = 1:10)
    df$A <- df$A * 1000
    

    【讨论】:

    • 如果我有很多列 (n=30),我该怎么做?输入所有的名字会很麻烦......
    • 是的,实际上我总是对这样的数据框进行计算:a&lt;-as.data.frame(sapply(df[,2:42], function(x){x*1000})) 但是我的数据框 df 的第一列不在新创建的数据框 (a) 内...所以我必须制定解决方法并将旧数据框的第一列合并到新数据框。所以这没关系,但我认为可能有更简单的方法......
    • 我只尝试了最后一个选项并且工作顺利。谢谢
    【解决方案2】:

    以下代码会将所需的函数应用于您指定的唯一列。 我将创建一个简单的数据框作为可重现的示例。

    (df <- data.frame(x = 1, y = 1:10, z=11:20))
    (df <- cbind(df[1], apply(df[2:3],2, function(x){x*1000})))
    

    基本上,使用cbind() 选择您不希望函数在其上运行的列,然后在目标列上使用带有所需函数的apply()

    【讨论】:

    • 抱歉评论,但谢谢!正在寻找这样的东西,cbind() 工作得很好。
    【解决方案3】:

    dplyr 中,我们将使用mutate_at,您可以在其中选择或排除(通过在变量名前加上“-”减号)特定变量。 你可以命名一个函数

    df <- df %>% mutate_at(vars(columnA), scale)

    或创建自己的

    df <- df %>% mutate_at(vars(columnA, columnC), function(x) {do this})

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多