如何拆分数据框,在每个列表数据框中创建新变量,以及未拆分?

时间:2016-08-11 02:09:31

标签: r dataframe data-manipulation

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

我正在尝试创建的新变量将变量B.2从0变为1,用于变量Type中的每个因子级别。

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组合在一起,所以一切都在一行代码。有更有效的方法吗?

2 个答案:

答案 0 :(得分:1)

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

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

这是一个按操作分组。因此,可以使用data.tabledplyr

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

答案 1 :(得分:0)

如你所说,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的解决方案更快