使用自定义名称在R中创建动态数据框

时间:2014-07-16 10:34:42

标签: r dataframe subset

我想动态创建数据框并为其指定自定义名称。

我有一个这样的主数据集:

ID    grp    val1    val2
1      a      32       9
1      b      21       31
1      c      43       76
2      a      23       67
2      b      5        45
2      c      65       76
3      a      43       34
3      b      43       7
3      c      12       87
4      a      43       35
4      b      65       87
4      c      21       55

我想创建像

这样的数据框架
data1:
ID    grp    val1    val2
1      a      32       9
1      b      21      31
1      c      43      76

data2:
ID    grp    val1    val2
2      a      23       67
2      b      5        45
2      c      65       76

依旧......

我尝试了一些类似的事情:

myID<-1:4
df <- paste('data',myID, sep ='')
ll <- sapply(df, function(x)
{
  data.frame ()
  df<-masterData[which(masterData$ID==myID),]
})

另一种没有预期结果的尝试:

sapply(myID,function(x) df<-as.data.frame(masterData[which(masterData$ID==myID,]))

我猜子集不会为多个值执行此操作:

myframes<-list(subset(masterData,masterData$ID==myID))

3 个答案:

答案 0 :(得分:3)

我只会使用split并将其全部保存在list

split(masterData, masterData$ID)
# $`1`
#   ID grp val1 val2
# 1  1   a   32    9
# 2  1   b   21   31
# 3  1   c   43   76
# 
# $`2`
#   ID grp val1 val2
# 4  2   a   23   67
# 5  2   b    5   45
# 6  2   c   65   76
# 
# $`3`
#   ID grp val1 val2
# 7  3   a   43   34
# 8  3   b   43    7
# 9  3   c   12   87
# 
# $`4`
#    ID grp val1 val2
# 10  4   a   43   35
# 11  4   b   65   87
# 12  4   c   21   55

如果你真的想要在很多data.frame s的情况下乱丢你的工作场所,而不是让所有东西保持整洁list,你可以使用list2env

X <- split(masterData, masterData$ID)
names(X) <- paste0("data", names(X))
list2env(X, envir=.GlobalEnv)
# <environment: R_GlobalEnv>

ls(pattern = "^data[0-9]$")             ## What did that create?
# [1] "data1" "data2" "data3" "data4"
data1
#   ID grp val1 val2
# 1  1   a   32    9
# 2  1   b   21   31
# 3  1   c   43   76

答案 1 :(得分:0)

答案 2 :(得分:0)

另一个答案是使用plyr的{​​{1}}函数

dlply