2

我创建了一个特征向量(data.frame),它有一个 id、feat1、feat2、feat3、boolean,但是在这个数据框中有重复的 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 循环编写,但由于这是一个大型数据集,因此需要很长时间。做这个的最好方式是什么?

4

3 回答 3

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")`).

`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
于 2013-09-06T02:22:36.400 回答
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)
}
于 2013-09-06T00:35:10.637 回答
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)
于 2018-11-15T20:41:37.167 回答