我在普通的R环境中有一堆名为Ldat.1,Ldat.2等的数据帧,我可以交互访问。
从控制台,我可以输入:
> dim(Ldat.1)[1]
[1] 40
> dim(Ldat.2)[1]
[1] 39
所以我可以说第一行有40行,第二行有39行。
但是,有几十个数据框,我想编写一个脚本来告诉我每帧中有多少行。
我尝试了以下内容:
print(dim(Ldat.1)[1])
print(dim(Ldat.2)[1])
for (i in 1:2){
namex<-paste("Ldat.",i,sep="")
size<-dim(.GlobalEnv$namex)
print(size[1])
}
并且控制台显示:
> print(dim(Ldat.1)[1])
[1] 40
> print(dim(Ldat.2)[1])
[1] 39
> for (i in 1:2){
+ namex<-paste("Ldat.",i,sep="")
+ size<-dim(.GlobalEnv$namex)
+ print(size[1])
+ }
NULL
NULL
构造字符串很容易:
for (i in 1:2){
namex<-paste("Ldat.",i,sep="")
size<-dim(namex)
print(namex)
}
产生
> for (i in 1:2){
+ namex<-paste("Ldat.",i,sep="")
+ size<-dim(namex)
+ print(namex)
+ }
[1] "Ldat.1"
[1] "Ldat.2"
但是尽管尝试了“as.data.frame”和“envir =”的各种组合,我似乎无法让R将字符串“Ldat.1”解释为可从控制台访问的对象的名称。
提前致谢。
答案 0 :(得分:4)
1)这将列出每个数据框的名称及其拥有的行数:
sapply(Filter(is.data.frame, mget(ls())), nrow)
如果我们已经有nms
数据帧名称的向量,那么我们可以将其减少为:
nms <- c("Ldat.1", "Ldat.2")
sapply(mget(nms), nrow)
2)这是另一种方式:
simplify2array(Filter(Negate(is.null), eapply(.GlobalEnv, nrow)))
3)还可以尝试R.oo包中的ll
函数。
答案 1 :(得分:2)
请改为尝试:
for (i in 1:2){
namex<-paste("Ldat.",i,sep="")
size<-dim(.GlobalEnv[[namex]])
print(size[1])
}
这个问题与环境无关,而且与$
不评估其第二个参数的事实有关(它的第一个参数是它前面的标记名,.GlobalEnv
在这种情况下)。名为“namex”的.GlobalEnv
中没有对象。另一方面,“[[”执行评估步骤,因此{for {-}}(在for循环的第一次传递期间为“Ldat.1”)的值将被替换,查找将成功。