R:将指定列的对象名称的字符列表转换为新数据框?

时间:2013-07-19 22:40:19

标签: r dataframe

我已尝试过本网站上列出的很多内容,但据我所知,还没有回答这个问题。

我有一个字符列表,用于指定工作区中的对象名称。这些对象中的每一个都表示我想cbind到新数据框中的单独列。

我可以非常轻松地手动执行此操作。但是,我无法将字符列表转换为绑定在一起作为新数据框中列的对象列表。这是列表的结构:

list("ID", "ID1", "ID2", "ID3", "Year", "Month", "Element", "Value1", 
    "MFlag1", "QFlag1", "SFlag1", "Value2", "MFlag2", "QFlag2", 
    "SFlag2", "Value3", "MFlag3", "QFlag3", "SFlag3", "Value4", 
    "MFlag4", "QFlag4", "SFlag4", "Value5", "MFlag5", "QFlag5", 
    "SFlag5", "Value6", "MFlag6", "QFlag6", "SFlag6", "Value7", 
    "MFlag7", "QFlag7", "SFlag7", "Value8", "MFlag8", "QFlag8", 
    "SFlag8", "Value9", "MFlag9", "QFlag9", "SFlag9", "Value10", 
    "MFlag10", "QFlag10", "SFlag10", "Value11", "MFlag11", "QFlag11", 
    "SFlag11", "Value12", "MFlag12", "QFlag12", "SFlag12", "Value13", 
    "MFlag13", "QFlag13", "SFlag13", "Value14", "MFlag14", "QFlag14", 
    "SFlag14", "Value15", "MFlag15", "QFlag15", "SFlag15", "Value16", 
    "MFlag16", "QFlag16", "SFlag16", "Value17", "MFlag17", "QFlag17", 
    "SFlag17", "Value18", "MFlag18", "QFlag18", "SFlag18", "Value19", 
    "MFlag19", "QFlag19", "SFlag19", "Value20", "MFlag20", "QFlag20", 
    "SFlag20", "Value21", "MFlag21", "QFlag21", "SFlag21", "Value22", 
    "MFlag22", "QFlag22", "SFlag22", "Value23", "MFlag23", "QFlag23", 
    "SFlag23", "Value24", "MFlag24", "QFlag24", "SFlag24", "Value25", 
    "MFlag25", "QFlag25", "SFlag25", "Value26", "MFlag26", "QFlag26", 
    "SFlag26", "Value27", "MFlag27", "QFlag27", "SFlag27", "Value28", 
    "MFlag28", "QFlag28", "SFlag28", "Value29", "MFlag29", "QFlag29", 
    "SFlag29", "Value30", "MFlag30", "QFlag30", "SFlag30", "Value31", 
    "MFlag31", "QFlag31", "SFlag31")

同样,这些都是我试图在新数据框中作为列调用的现有工作区对象。

修改

以下是我用来创建每个向量的代码:

idCols  <- list("ID","ID1","ID2","ID3","Year","Month","Element")
varCols <- paste(rep(list("Value","MFlag","QFlag","SFlag"),31),rep(c(1:31),each=4),sep="")
allCols <- c(idCols,varCols)
allList <- as.list(paste(allCols))

这些对象仅暂时位于工作空间中,因为它们嵌套在自定义函数中。但是,我很想听到有关创建对象列表的更多信息。

2 个答案:

答案 0 :(得分:3)

这是一个黑暗中的镜头:

x <- 1:5
y <- 1:5
> do.call(cbind,mget(c('x','y')))
     x y
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5

请注意,您需要向量中的字符而不是列表,因此请使用c()而不是list()

该解决方案的一个缺点是,如果每个对象都是原子向量,则结果将是矩阵。如果您的所有数据都是数字的,这不是一个大问题,您可以使用as.data.frame简单地强制转换为数据框。但是如果你在那里混合了一些字符向量,你将得到一个字符矩阵,所有数字向量都转换为字符。

我认为可以使用cbind.data.frame而非cbind来修复此缺点。

但是,当然,你工作区中有很多物体浮动的事实是一个非常糟糕的迹象。通常在R中,我们尽量不以这种方式组织对象。有更好的相关对象列表。然后,您可以使用lapply等工具快速,紧凑地对其进行操作。

答案 1 :(得分:1)

这避免了对矩阵的任何强制:

data.frame(lapply(setNames(your_list, your_list), get))