我有2个数据框,试图将它们分开,但是我想根据df2中行的平均值来计算df1中的新列:
df1:
Name <- c("t1", "t2", "t3")
Diam <- c(95, 104, 72)
Rad <- c(47.5, 52, 36)
df1 <- data.frame(Name, Diam, Rad)
df2:
Name <- c("t1A", "t1B", "t2A", "t2B", "t2C", "t3B")
Width <- c(4000, 3200, 2300, 2700, 2100, 3500)
df2 <- data.frame(Name, Width)
我想在df1中添加第四列,以在“名称”的前两个字符相同时计算df2中“宽度”的均值。我的预期输出如下所示:
df3:
Name <- c("t1", "t2", "t3")
Diam <- c(95, 104, 72)
Rad <- c(47.5, 52, 36)
WidthMean <- c(3600, 2366.667, 3500)
df3 <- data.frame(Name, Diam, Rad, WidthMean)
我可以通过在df2中拆分“名称”列,然后根据新的拆分名称查找均值,然后将df2中的平均值作为新列添加到df1中来实现。但是,我必须对大约75个data.frame执行此操作,并希望找到一种处理数据的更快方法(并且用更少的代码行!)。
当前代码:
df2$"NameID" <- df2$Name
df2$NameID <- gsub(".?$", "", df2$NameID)
df2out <- aggregate(Width ~ NameID, data = df2, FUN = mean)
df1$"WidthMean" <- df2out$Width
df1
最佳答案
如果要使用基本R,可以编写一个简单的函数来执行此操作,然后使用for
循环(或可能的apply
)执行此操作。
func.widthmeans <- function(prefix,target.df) {
active.df <- get(target.df)
return(mean(active.df[grep(pattern=prefix,x=active.df$Name),"Width"]))
}
for(x in df1$Name) {
df1[df1$Name==x,"MeanWidth"] <- func.widthmeans(prefix=x,target.df="df2")
}
rm(x)
df1
Name Diam Rad MeanWidth
1 t1 95 47.5 3600.000
2 t2 104 52.0 2366.667
3 t3 72 36.0 3500.000
这是一种更通用的解决方案,该函数接受两个数据帧,一个具有通用名称,一个具有宽度数据,就像您在注释中所述。
func.widthmeans <- function(data.df,width.df) {
for(x in data.df$Name) {
data.df[data.df$Name==x,"MeanWidth"] <- mean(width.df[grep(pattern=x,x=width.df$Name),"Width"])
}
rm(x)
return(data.df)
}
func.widthmeans(data.df = df1,width.df = df2)
Name Diam Rad MeanWidth
1 t1 95 47.5 3600.000
2 t2 104 52.0 2366.667
3 t3 72 36.0 3500.000
关于r - R从第二个数据帧计算新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24787768/