【问题标题】:Using loop and subset to create different data.frames使用循环和子集创建不同的 data.frames
【发布时间】:2012-07-13 11:52:55
【问题描述】:

我在 R 中有一个 data.frame。我想使用 loopsubset 函数创建 三个 不同的 data.frame。我有一个很大的 data.frame,但我需要的是下面的示例:

sex<-c("M","M","M","F","M","F")
age<-c(20,18,17,20,18,17)
name<-c("John", "Joseph", "Bill", "Sarah", "Robert", "Dana")
data<-data.frame(sex, age, name)

>data
        sex  age   name
    1   M    20    John
    2   M    18    Joseph
    3   M    17    Bill
    4   F    20    Sarah
    5   M    18    Robert
    6   F    17    Dana

我想要的是:

>age17
      sex   age   name
    1 M     17    Bill
    2 F     17    Dana

>age18
      sex   age   name
    1 M     18    Joseph
    2 M     18    Robert


>age20
      sex   age   name
    1 M     20    John
    2 F     20    Sarah

我可以使用以下命令:

>age17<-subset(data, data[,2]==17)
>age18<-subset(data, data[,2]==18)
>age20<-subset(data, data[,2]==20)

但是可以使用循环来减小命令的大小吗?

【问题讨论】:

  • 我想你可能会喜欢split这个功能。

标签: r loops dataframe subset


【解决方案1】:

使用split:

x <- split(data, data$age)

x
$`17`
  sex age name
3   M  17 Bill
6   F  17 Dana

$`18`
  sex age   name
2   M  18 Joseph
5   M  18 Robert

$`20`
  sex age  name
1   M  20  John
4   F  20 Sarah

您现在有一个数据框列表,您可以使用任何提取运算符访问列表中的元素,即$[[[

比如第一个元素:

x[1]
$`17`
  sex age name
3   M  17 Bill
6   F  17 Dana

或名称为17 的元素。但请注意,您必须使用反引号来引用这些名称,因为以数字开头的名称不是标准的:

x$`17`
  sex age name
3   M  17 Bill
6   F  17 Dana

【讨论】:

  • 这会将data.frames 分配给变量age17age18invisible(lapply(split(data, data$age), function(x) { assign(paste0("age", x$age[1]), x, pos=.GlobalEnv) }))
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多