R、 是否使用字符筛选(子集)数据并相应地分配名称?

R、 是否使用字符筛选(子集)数据并相应地分配名称?,r,subset,assign,R,Subset,Assign,我有一个数据集raw.data.2010,需要对不同的动物物种进行几个步骤的分组。我还需要在每个过滤过程之后相应地命名它们。我编写了一个简单的代码,如下所示: #Creating reproducible data###### site=rep(list("Q", "R", "S", "T"), each=500) grid=sample(1:2, size=2000, replace=TRUE) spp=rep(list("A", "B", "C", "D", "E"), each=400)

我有一个数据集raw.data.2010,需要对不同的动物物种进行几个步骤的分组。我还需要在每个过滤过程之后相应地命名它们。我编写了一个简单的代码,如下所示:

#Creating reproducible data######
site=rep(list("Q", "R", "S", "T"), each=500)
grid=sample(1:2, size=2000, replace=TRUE)
spp=rep(list("A", "B", "C", "D", "E"), each=400)
fate=sample(1:5, size=20000, replace=TRUE)
sex=rep(list("M","F"), each=2000)
weight=sample(85:140, size=2000, replace=TRUE)

raw.data=as.data.frame(cbind(site, grid, spp, fate, sex, weight))

### main codes#####
spp=c("A", "B", "C", "D", "E")
    for (i in spp){
        name=paste(i, "raw", sep=".", collapse="")
        filter=paste("select",i, sep="", collapse="")
        assign(filter, raw.data$spp==i)
        assign(name, raw.data[get(filter),])
    }
我检查了过滤器,它们工作正常。但是最后一行不起作用,所以我调用的所有子集数据都返回NA。怎么了?多谢各位

编辑:嗨,谢谢大家的建议。我编辑了我的代码,所以它是可复制的。基本上,我想先用spp过滤我的原始数据,然后我可以继续添加更多的过滤器,根据站点、网格、命运等对它们进行分组。我需要能够单独访问过滤后的数据,以便我可以对其进行操作以供以后使用,例如,计算不同性别或年龄组的体重和其他测量值。我希望以后能够调用A.raw,A.Q.data


因为我想在不同的层面上分析我的数据,例如人口层面、个人层面、站点/网格层面,并能够根据我的需要对数据进行汇总/拆分。这就是这个代码的目的。希望我的解释不会把你弄糊涂

问题似乎在于,您需要使用filter中存储的名称获取变量,而不是使用filter本身

这应该起作用:

spp=c("A", "B", "C", "D", "E")
for (i in spp){
    name=paste(i, "raw", sep=".", collapse="")
    filter=paste("select",i, sep="", collapse="")
    assign(filter, raw.data.2010$Spp==i)
    assign(name, raw.data.2010[get(filter),])
}

问题似乎是,您需要获取具有存储在filter中的名称的变量,而不是使用filter本身

这应该起作用:

spp=c("A", "B", "C", "D", "E")
for (i in spp){
    name=paste(i, "raw", sep=".", collapse="")
    filter=paste("select",i, sep="", collapse="")
    assign(filter, raw.data.2010$Spp==i)
    assign(name, raw.data.2010[get(filter),])
}

从长远来看,如果您不再使用赋值和get的全局变量,而是使用列表,并记住使用[[而不是$。

从长远来看,如果您不再使用全局变量赋值和get,而是使用列表,并记住使用[[而不是$。

进行子集,您的示例可能会为自己节省大量的工作和悲伤。您的示例是一个正确的示例,永远不要使用as.data.framecbind


你的例子全搞糟了。这里有一个合适的例子,永远不要使用as.data.framecbind


如果你做了一个演示你的问题/问题的例子,我们会发现回答起来更容易。我强烈怀疑你最好做一些类似splitraw.data.2010,raw.data.2010$Spp的事情-但我强烈支持@Andrie关于可复制数据的建议,以及更多的上下文:你打算如何处理衍生var一旦你创建了它们,我就可以编辑代码了?我通过添加一个可复制的data.frame来编辑代码,还添加了更多关于我研究目的的解释。你一定要查看plyr软件包,它正是为完成这类任务而设计的。@Ben Bolker,我尝试了“拆分”,速度要快得多。另外,只需使用“$”来提取我想要的物种。谢谢。我如果你提出了一个能证明你的问题/问题的建议,我们会发现它更容易回答。我强烈怀疑你最好做一些像splitraw.data.2010,raw.data.2010$Spp这样的事情-但我强烈支持@Andrie关于可复制数据的建议,以及一点更多的上下文:你将如何处理衍生变量一旦你创建了可复制的数据?我通过添加一个可复制的data.frame编辑了我的代码,还添加了更多关于我研究目的的解释。你一定要查看plyr软件包,它正是为这类任务而设计的。@Ben Bolker,我尝试了“拆分”,速度更快。另外,只需使用“$”提取我想要的物种。谢谢。See@GregSnow的答案也是。一般来说,使用get和assign不是一个好主意。请改为使用列表。不过也请参阅@GregSnow的答案。使用get和assign通常不是一个好主意。改为使用列表。哦,使用[[比$快吗?对不起,如果这是大家的常识,我根本不是一个程序员,还在学习。不是[[更快,更安全,更灵活。它计算参数,而“$”不计算参数。顺便说一句,你想计算筛选对象的可怕名称。哦,用[[比$快吗?很抱歉,如果这是大家的常识,我根本不是一个程序员,还在学习。不是[[更快,更安全,更灵活。它计算参数,而“$”不计算。顺便说一句,你想计算筛选对象的可怕名称。