我想通过%>%
将数据框传递给lapply,但是我需要能够访问列的名称,所以我的lapply参数是这样的:
mydf %>%
lapply( 1:length(.), function(x) {
manipulate_df( mydf[x], using_column_names(names(mydf)[x] )
})
然而,当我尝试时,我收到以下错误:
Error in match.fun(FUN) :
'1:length(.)' is not a function, character or symbol
据我所知,R和lapply不喜欢1:length(.)
。我认为一个有效的选择是打破链条,但我想学习如何正确地做到这一点。
答案 0 :(得分:2)
你的问题是%>%是插入mydf作为第一个参数(因此三个参数传递给lapply。尝试将整个lapply表达式包装在括号中。这可以防止插入行为:
mydf %>%
{ lapply( 1:length(.), function(x) {
manipulate_df( mydf[x], using_column_names(names(mydf)[x] )
}) }
我认为最漂亮的解决方法是创建一个新功能:
manipulate_whole_df = function(mydf)
lapply( 1:length(mydf), function(x)
manipulate_df( mydf[x], using_column_names(names(mydf)[x] ) ) )
mydf %>%
manipulate_whole_df
甚至
library(tidyr)
mydf %>%
gather(variable, value) %>%
group_by(variable) %>%
do(manipulate_df(.$value,
.$variable %>% first %>% using_column_name ) )
答案 1 :(得分:0)
lapply()
中的函数仅引用列索引/列名称,以不依赖于lapply迭代的方式引用mtcars,因此管道名称
names(mtcars) %>% lapply(function(x) mtcars[x])
或写一个合适的封闭
names(mtcars) %>% lapply(function(x, df) df[x], df=mtcars)
或者您可能真的不需要访问名称而只需要访问列?
mtcars %>% lapply(function(x) sqrt(sum(x)))
答案 2 :(得分:0)
我认为您想要的是以下内容:
mydf %>% length %>% seq %>%
lapply(function(x) {
manipulate_df( mydf[x], using_column_names(names(mydf)[x] )
})
或者您可以使用lambda函数:
mydf %>% {1:length(.)} %>%
lapply(function(x) {
manipulate_df( mydf[x], using_column_names(names(mydf)[x] )
})