R中的动态变量命名

8
structure(list(Metrics = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 
1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 
5L, 6L), .Label = c("  LINESCOMM ", "  NCNBLOC_FILE ", "  RCYCLOMATIC ", 
"  RISK ", "  RMAXLEVEL ", "  RNOEXSTAT "), class = "factor"), 
    Project = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L
    ), .Label = c("  Demo_Architect ", "  Demo_May_10 ", "  Demo_May_14 ", 
    "  NPP "), class = "factor"), Value = c(1172, 1500, 142, 
    4.241, 24, 98, 1139, 1419, 128, 3.546, 22, 85, 1172, 1500, 
    142, 4.241, 24, 98, 115008, 148903, 14539, 105.914, 604, 
    15710)), .Names = c("Metrics", "Project", "Value"), row.names = c(NA, 
-24L), class = "data.frame")->agg

我想要做的是:对于每个唯一的项目名称,我想创建一个包含所需值的单独变量名称。
我正在尝试以下代码:
x=data.frame()
attach(agg)
r<-as.character(unique(Project))
for(i in length(agg))
{
  x<-subset(agg,Project==r[i],select=c("Project","Metrics","Value"))
  assign() #This is where i am making mistake while creating dynamic variable naming
}

换句话说,我希望每次执行for循环时创建单独的变量名称。

注意:最好将变量名称设置为“project”列值的名称。


length(agg)将计算您的data.frame的列数。您确定这就是您想要的吗?您的解释不是很清楚,因此需要提供所需的输出。split( agg , agg$Project )是否给您所需的内容? - Simon O'Hanlon
2个回答

10

assign用于创建变量,第一个参数为所需创建的变量名,第二个参数为变量的值。注意,在您的项目名称中包含前导空格时,我还使用了str_trim来摆脱它们。

library(stringr)
projects <- levels(agg$Project)
for (p in projects) {
  x <- subset(agg, Project==p)
  assign(str_trim(p), x)    
}

现在你在工作区中拥有以变量形式存在的项目:

ls()
[1] "agg"            "Demo_Architect" "Demo_May_10"    "Demo_May_14"    "NPP"           
[6] "p"              "projects"       "x"

例如。

> Demo_Architect
          Metrics           Project    Value
1      LINESCOMM    Demo_Architect  1172.000
2   NCNBLOC_FILE    Demo_Architect  1500.000
3    RCYCLOMATIC    Demo_Architect   142.000
4           RISK    Demo_Architect     4.241
5      RMAXLEVEL    Demo_Architect    24.000
6      RNOEXSTAT    Demo_Architect    98.000

3
为什么不将数据框拆分成列表来处理?
dflist <- split(agg, agg$Project)
str(dflist)
## List of 4
 ## $   Demo_Architect :'data.frame':   6 obs. of  3 variables:
 ## $   Demo_May_10    :'data.frame':   6 obs. of  3 variables:
 ## $   Demo_May_14    :'data.frame':   6 obs. of  3 variables:
 ## $   NPP            :'data.frame':   6 obs. of  3 variables:

names(dflist) <- paste0("project", seq_along(dflist))

如果你真的想将列表元素(新的 dfs)存在全局环境中,可以使用 list2env

list2env(dflist, .GlobalEnv)
ls()
## [1] "agg"      "dflist"   "project1" "project2" "project3"
## [6] "project4"

head(project3)
##            Metrics        Project    Value
## 13      LINESCOMM    Demo_May_14  1172.000
## 14   NCNBLOC_FILE    Demo_May_14  1500.000
## 15    RCYCLOMATIC    Demo_May_14   142.000
## 16           RISK    Demo_May_14     4.241
## 17      RMAXLEVEL    Demo_May_14    24.000
## 18      RNOEXSTAT    Demo_May_14    98.000

我想指出,使用 lapplysapply 或者 for 循环来操作列表通常比在全局环境中直接操作更加安全。

编辑:如果你需要使用不同的命名方案。

names(dflist) <- paste0("project_", gsub("\\s+", "", levels(agg$Project)))
list2env(dflist, .GlobalEnv)
ls()
## [1] "agg"                    "dflist"                
## [3] "project_Demo_Architect" "project_Demo_May_10"   
## [5] "project_Demo_May_14"    "project_NPP"

感谢您提供的列表解决方案。但是我想要不同的变量命名,因为这将帮助我创建该数据的PDF文件。注意:我是R的初学者。 - Koushik Saha
@user3132179,我编辑了我的答案,为不同的df取了更好的名称。 - dickoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接