R为每个唯一ID创建新数据框

时间:2013-09-06 00:06:09

标签: r dataframe

我创建了一个具有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循环编写,但由于这是一个大型数据集,因此需要超长时间。这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:3)

根据评论中的建议,使用split。如果您确实想要创建新对象,请将splitlist2env结合使用,如下所示:

## 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)