R 将列表列表转换为摘要表
这里是相对新手。我很难将列表列表转换为更清晰的摘要表。一般来说,我希望对具有多列的数据帧应用多个函数,并获得一个汇总表作为输出,其中行名是函数名,列名与数据帧的列名相同 以下面的示例代码为例。假设我创建以下简单的数据帧:R 将列表列表转换为摘要表,r,R,这里是相对新手。我很难将列表列表转换为更清晰的摘要表。一般来说,我希望对具有多列的数据帧应用多个函数,并获得一个汇总表作为输出,其中行名是函数名,列名与数据帧的列名相同 以下面的示例代码为例。假设我创建以下简单的数据帧: a = seq(100,110,2) b = seq(200,220,4) df = data.frame(a,b) 接下来,假设我创建以下两个示例函数,每个函数都将获取一个数字向量,并生成一个数字: func1 = function(x) sum(x)**2 func2 =
a = seq(100,110,2)
b = seq(200,220,4)
df = data.frame(a,b)
接下来,假设我创建以下两个示例函数,每个函数都将获取一个数字向量,并生成一个数字:
func1 = function(x) sum(x)**2
func2 = function(x) sqrt(sum(x))
然后,我想将这两个函数包装成一个函数,该函数将同时运行这两个函数:
combined_func = function(x){
combined = list("func1" = func1(x), "func2" = func2(x))
return(as.data.frame(do.call(rbind, combined)))
}
然后,我将此“组合函数”应用于数据帧的两列,如下所示:
lapply(df, combined_func)
a b
func1 396900.0000 1.587600e+06
func2 25.0998 3.549648e+01
这是我得到的结果:
$a
V1
func1 396900.0000
func2 25.0998
$b
V1
func1 1.587600e+06
func2 3.549648e+01
虽然输出在技术上是正确的,但我讨厌格式。如顶部所述,我希望最终结果是函数名作为行名,列名(本例中的“a”和“b”)作为列名。我希望结果如下所示:
lapply(df, combined_func)
a b
func1 396900.0000 1.587600e+06
func2 25.0998 3.549648e+01
过去几天我一直在搜索StackOverflow,但似乎不知道如何实现这一点。非常感谢您的任何帮助 您可以执行以下操作:
combined <- lapply(df, combined_func)
table <- do.call(cbind, combined)
colnames(table) <- list('a', 'b')
这能像你想象的那么简单吗
Reduce(cbind,lappy(df,组合函数))
?一种稍微不同的方法,它省去了对
组合功能的需要
funs <- list(func1 = func1, func2 = func2)
t(sapply(funs, mapply, df))
#-----
a b
func1 396900.0000 1.587600e+06
func2 25.0998 3.549648e+01
funs您可以将combined_func
更改为:
combined_func = function(x){
c("func1" = func1(x), "func2" = func2(x))
}
并用sapply
调用它:
sapply(df, combined_func)
# a b
#func1 396900.0 1587600.0
#func2 25.1 35.5
@kamiks np,我刚刚更新了一个方法来重命名colnames。非常感谢!!!!你解决了长达一周的令人沮丧的问题。我想可能会有一些现成的函数或包,只需将一个数据帧和一系列函数作为参数,并创建这样一个表。但这是可行的。再次感谢你!同样有效!只需要将colname更改为原始dataframe的colname。是的,还需要将更改为.data.frame(组合)
。给猪剥皮的方法很多,不要太相信自动命名的R。