【发布时间】:2021-02-20 03:41:38
【问题描述】:
我有一个大约 1000 行的数据框 df,其中包含以下列:
df$ID<- c("ab11", "ab12" ...) #about 1000 rows
df$ID1<-numbers ranging from 1 to 20k # for all intense and purposes this can be treated as class 'factor'
df$Acol<- #numbers ranging from 1 to 1000
df$Bcol<- #numbers ranging from 0 to 1
以下列表在每个列表中为我提供了 12 个值:
A<- seq(50,600,by=50)
B<- seq(0.2,1,by=0.75)
我正在尝试做两件事:
- 我想通过使用列表 A 和 B 的各种组合过滤原始数据集来创建数据帧。所以 144 个数据帧。
- 拥有这些数据帧后,我想一次组合 3 个数据帧,看看 ID 的频率是否与主数据帧 x 匹配,如果匹配,则获取匹配数据帧的组合信息。
所以对于 1,这是我的方法:
df_50_0.2<-subset(df, df$Acol>=50 & df$Bcol>=0.2)
我不能把它写出 144 次——我需要一个循环。我尝试了嵌套循环,但这并没有给我 A 和 B 的所有组合,所以我尝试了一个 while 循环。
这是我的代码:
i<-50
while (i<550) {
for (j in B) {
assign(paste("df","_",as.character(i),"_",as.character(j)), df %>%
filter (Acol>=i) %>%
filter(Bcol>=j),envir=.GlobalEnv
i<-i+50
}}
这给了我想要的结果,除了它没有根据 B 拆分数据帧。所以输出类似于我刚刚过滤具有 A 值的数据时的输出。
对于第二部分,我需要一次遍历三个数据帧的所有可能组合。这是我的代码:
df.final<-rbind (df_50_0.2,df_100_0.25,df_150_0.5)
tmp<-subset(table(df.final$ID),!(table(df.final$ID) %in% table(x$ID))
我希望上述内容处于循环状态。如果 tmp 有任何值,我不希望它成为输出。如果为 0,即与主数据帧 x 中的 ID 频率完美匹配,我希望将其写入。所以像下面这样的循环?我希望迭代检查所有可能的组合,以得出与主数据帧 x ID 频率完美匹配的组合:
if tmp = NULL
tmp
else rm(tmp)
非常感谢任何帮助。也欢迎提供 python 解决方案!
以下链接中提供但针对两列进行修改的解决方案可能会有所帮助Filter loop to create multiple data frames
【问题讨论】:
-
您能提供一个最小的可重现示例吗?尝试制作一个玩具示例,帮助我们了解您想要做什么。
-
您是否尝试创建重叠数据框?命令
df_50_0.2<-subset(df, df$A>=50 & df$B>=0.2)将包含所有观察结果。下一个将包括 A 和 B 两个较小组中的所有组以外的所有组,依此类推。 -
@dcarlson,是的。数据框将重叠
-
@JoaoPedroMacalos,以下链接中提供的解决方案,但针对两列进行了修改可能会有所帮助stackoverflow.com/questions/54679034/…
标签: python r dataframe for-loop while-loop