我创建了一个具有id,feat1,feat2,feat3,boolean的特征向量(data.frame),但在此数据框中有重复的id,这是有目的的。我想要做的是当我遍历这个数据帧时为每个id构建新的数据帧。
为简单起见,我假设我有两列。
X1 X2 X3
1 000000001 -1.4061361 1
2 000000001 -0.1973846 1
3 000000002 -0.4385071 1
4 000000001 -0.6593677 0
5 000000001 -1.2592415 0
6 000000001 -0.5463655 1
7 000000002 0.4231117 0
8 000000002 -0.1640883 1
9 000000002 0.7157506 0
10 000000002 2.3234110 1
我想基于X1构建不同的数据帧基本上我希望将所有相同的X1都放到自己的数据帧中。我使用多个for循环编写,但由于这是一个大型数据集,因此需要超长时间。这样做的最佳方式是什么?
答案 0 :(得分:3)
根据评论中的建议,使用split
。如果您确实想要创建新对象,请将split
与list2env
结合使用,如下所示:
## What is in the workspace presently?
ls()
# [1] "mydf"
## This is where most R users would probably stop
split(mydf, mydf$X1)
# $`1`
# X1 X2 X3
# 1 1 -1.4061361 1
# 2 1 -0.1973846 1
# 4 1 -0.6593677 0
# 5 1 -1.2592415 0
# 6 1 -0.5463655 1
#
# $`2`
# X1 X2 X3
# 3 2 -0.4385071 1
# 7 2 0.4231117 0
# 8 2 -0.1640883 1
# 9 2 0.7157506 0
# 10 2 2.3234110 1
上面的命令会创建一个list
,如果您要对每个列表项进行类似的计算,这是一种非常方便的格式。大多数R用户会停在那里。如果您的工作区中确实需要单独的对象,请使用list2env
:
list2env(split(mydf, mydf$X1), envir=.GlobalEnv)
# <environment: R_GlobalEnv>
## How many objects do we have now?
ls()
# [1] "1" "2" "mydf"
请注意,这些名称在语法上无效,因此您需要使用反引号(</code>) to access them. (Or, alternatively,
get("1")`).
</code>) to access them. (Or, alternatively,
答案 1 :(得分:1)
这使用一个for循环 - 更好吗?
ids <- unique(df$X1)
for(i in 1:length(ids)){
id <- ids[i]
mini.df <- data.frame(df[df$X1 == id, ])
assign(paste("mini.df", i, sep="."), mini.df)
# or alternatively, if you wanted the data.frames to be assigned by id,
# assign(id, mini.df)
}
答案 2 :(得分:0)
听起来您希望能够使模型适合每个数据子集(并可能提取模型摘要)。您可以使用broom,dplyr,purrr和tidyr来实现此功能。这是一个示例:
library(broom)
library(dplyr)
library(purrr)
library(tidyr)
mtcars %>%
group_by(cyl) %>%
nest() %>%
mutate(model = map(data, lm, formula = mpg ~ disp + hp),
results = map(model, tidy)) %>%
unnest(results)