【问题标题】:How to split dataframe, create new variable in each list dataframe, and unsplit?如何拆分数据框,在每个列表数据框中创建新变量并取消拆分?
【发布时间】:2016-08-11 02:09:31
【问题描述】:

我正在尝试拆分数据框,在每个数据框列表对象中创建一个新变量,然后重新组装(取消拆分)原始数据框。

对于变量Type 中的每个因子水平,我尝试创建的新变量将变量B.2 从0 缩放到1。

BWRX$B.2 <- BWRX$B #Create a new version of B
BWRX.Split <- split(BWRX, BWRX$Type) #Split by Type
BWRX.Split.BScaled <-lapply(BWRX.Split, function(df){df$B.3 <- (df$B.2-min(df$B.2))/(max(df$B.2)-min(df$B.2))}) #Scale B.2

上面的代码返回一个列表,其中B.2 的值在每个因子级别内正确缩放。棘手的部分是我无法弄清楚如何将此变量添加到BWRX.Split 中的每个数据帧。

我认为df$B.3 会纠正这一点,但事实并非如此。一旦B.3 是每个数据帧的一部分,unsplit(, Type) 可以用来重新组装数据帧还是do.call 会更好?我试图将 unsplit 和 split 结合起来,以便所有内容都在一行中进行编码。有没有更有效的方法?

【问题讨论】:

标签: r dataframe data-manipulation


【解决方案1】:

我们真的不需要split 它,这可以使用来自base R 的ave 来完成。优点是新列的添加顺序与数据集原始行顺序相同。

transform(BWRX, BScaled = ave(B.2, Type, 
        FUN = function(x) (x- min(x))/(max(x)- min(x))))

这是一个分组操作。因此,可以使用data.table 或dplyr 高效完成

library(data.table)
setDT(BWRX)[, BScaled := (B.2 - min(B.2))/(max(B.2) - min(B.2)), by = Type]

【讨论】:

  • 是否有任何理由使用transform() 而不是data.frame()? R documentation 对应于 transform() 非常不祥。
  • @user3290799 只是在不改变原始对象的情况下返回输出。如果将其分配给原始对象BWRX,它将反映在对象中
【解决方案2】:

正如你提到的,MrFlick 也证实了,你可以简单地unsplit()它:

BWRX$B.3 <- unsplit(BWRX.Split.BScaled,BWRX$Type)

要在一行中执行此操作:

BWRX$B.3 <- unsplit(lapply(split(BWRX$B.2, BWRX$Type), function(x)(x-min(x))/(max(x)-min(x))),BWRX$Type)

但 Akrun 的解决方案都更快

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2020-11-15
    相关资源
    最近更新 更多