我正在尝试拆分数据框,在每个数据框列表对象中创建一个新变量,并重新组装(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组合在一起,所以一切都在一行代码。有更有效的方法吗?
答案 0 :(得分:1)
我们并非真的需要split
,这可以使用ave
中的base R
来完成。优点是新列的添加顺序与数据集的原始行顺序相同。
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]
答案 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的解决方案更快