Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 快速生成包含数据帧的新变量的方法_R_Dplyr_Partitioning_Paste_Magrittr - Fatal编程技术网

R 快速生成包含数据帧的新变量的方法

R 快速生成包含数据帧的新变量的方法,r,dplyr,partitioning,paste,magrittr,R,Dplyr,Partitioning,Paste,Magrittr,我想制作一组新的变量a,b,c,d…z来存储可存储的数据帧。然后,我将rbind存储tibble数据帧的新变量,并将它们导出为csv。如何在不必每次指定新变量的情况下更快地执行此操作 a<- subset(data.frame, variable1="condition1",....,) %>% group_by() %>% summarize( a=mean()) b<-subset(data.frame, variable1="condition2",....,) %

我想制作一组新的变量a,b,c,d…z来存储可存储的数据帧。然后,我将rbind存储tibble数据帧的新变量,并将它们导出为csv。如何在不必每次指定新变量的情况下更快地执行此操作

a<- subset(data.frame, variable1="condition1",....,) %>% group_by() %>% summarize( a=mean())
b<-subset(data.frame, variable1="condition2",....,) %>% group_by() %>% summarize( a=mean())
....

z<-subset(data.frame, variable1="condition2",....,) %>% group_by() %>% summarize( a=mean())

rbind(a,b,....,z)
a%group\u by()%%>%summary(a=mean())
b%分组依据()%>%汇总(a=mean())
....
z%分组依据()%>%汇总(a=mean())
rbind(a,b,…,z)

必须有一个更快的方法来做到这一点。我的数据集很大,因此将其作为a、b、c、…z的分区存储在内存中会导致计算机崩溃。重复键入子集条件以形成分区是一件乏味的事情。

与其在全局环境中创建多个对象,不如在
列表中重新读取它们,然后绑定它

library(data.table)
files <- list.files(pattern = "\\.csv", full.names = TRUE)
rbindlist(lapply(files, fread))
如果'condition1'、'condition2'等是表达式,请将其放置为
quosure
并对其求值

map2_df(quos(condition1, condition2), c("a", "b"), ~ df1 %>%
                 filter(!! .x) %>%
                  summarise(!! .y := mean(colnames)))

使用可复制的示例

conditions <- quos(Petal.Length>1.5,Species == 'setosa',Sepal.Length > 5) 
map2(conditions, c('a', 'b', 'c'), ~ 
           iris %>% 
                filter(!! .x)  %>%
                summarise(!! .y := mean(Sepal.Length)))
#[[1]]
#         a
#1 6.124779

#[[2]]
#      b
#1 5.006

#[[3]]
#         c
#1 6.129661
条件1.5,种=='setosa',萼片长度>5)
map2(条件,c('a','b','c'),~
虹膜%>%
过滤器(!!.x)%>%
总结(!!.y:=平均值(萼片长度)))
#[[1]]
#a
#1 6.124779
#[[2]]
#b
#1 5.006
#[[3]]
#c
#1 6.129661
如果我们使用
map2\u-dfc


注意:不清楚OP是否表示“condition1”、“condition2”作为表达式传递给
filter
ing行

您可以使用
purrr
软件包执行类似操作:

你可能需要使用NSE取决于你的情况。你可以参考

purrr::map\u df(
c(“条件1”、“条件2”、“条件N”),
#.x适用于每种情况
~subset(您的_数据_帧,variable1=.x,…)%%>%groupby(某些_列)%%>%summary(a=平均值(某些_列))
)
使用iris的示例:

库(rlang)
条件%
dplyr::filter(!!rlang::parse_expr(x))%>%
总目()
})
使用虹膜的示例:

条件%dplyr::filter(!!rlang::parse_expr(.x))%>%nrow()
#或者(!!几乎等同于eval或rlang::eval_tidy())
映射(条件,~iris%>%dplyr::filter(eval(rlang::parse_expr(.x)))%>%nrow()
[[1]]
[1] 113
[[2]]
[1] 50
[[3]]
[1] 118

@yifan我计划生成的每个新变量都是基于不同条件的数据帧的子集。回想我最初的计划,使变量a,…,z,条件1是变量a,条件2是变量b,条件n是变量z?条件1,。。。。条件n是布尔条件,是否在串联“c”中用逗号分隔条件1、、、、n?是的,可以使用
c
将它们串联起来。您需要使用
将字符串作为表达式计算
解析表达式。
如果包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,则更容易为您提供帮助。
子集
没有参数
variable1
或者某种类型的循环在这里会很有帮助
conditions <- quos(Petal.Length>1.5,Species == 'setosa',Sepal.Length > 5) 
map2(conditions, c('a', 'b', 'c'), ~ 
           iris %>% 
                filter(!! .x)  %>%
                summarise(!! .y := mean(Sepal.Length)))
#[[1]]
#         a
#1 6.124779

#[[2]]
#      b
#1 5.006

#[[3]]
#         c
#1 6.129661