从名称列表中提取字符并使其成为数字命令

时间:2017-02-26 18:36:42

标签: r class object character numeric

我有一个对象列表:区域$ X1,区域$ X2,区域$ X3,区域$ X4,...区域$ X100。每个对象的类是数字。这些对象是从SpatialPixelsDataFrame的结果中提取的。我已计算出从1到100的不同动物轨迹的缓冲区。

EG。区域$ X1是 0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0 我想计算区域$ X1中的1的数量,所以我使用了命令

table<-table(area$X1)
0      1 
600097   1504 
#extract the number of 1s 
table[[2]]

给了我1504

这将给出1的数量,从而给出了缓冲区的大小。

但是,我想对所有其他对象执行相同操作,区域$ X2直到区域$ X100。并计算整体的平均1s数。我想自动化这个过程。我该怎么办?

目前,我所做的是创建一个名单列表

names<-paste("area$X",1:100,sep="")

当我得到我想要的名字列表时,&#34; name&#34;中的元素类。是性格。

names: "area$X1" "area$X2" "area$X3" "area$X4" "area$X5" "area$X6" "area$X7" 
..."area$X99"  "area$X100"
class(names[1]): "character"

&#34;区域$ X1&#34;不再是我想要的数字。要添加,现在如果我尝试命令:

 table(names[1])
     area$X1 
              1 

它不会是0和1的表。它只包含一个元素,即名称&#34;区域$ X1&#34;。

我试图删除引号,但它没有帮助。

任何人都可以帮我吗? 感谢!!!

2 个答案:

答案 0 :(得分:0)

如果您的区域只有0或1,您可以使用colSums获取1&#39>的数量

colSums(area)
mean_area <- mean(colSums(area))

如果没有,并且您希望确保只计算1的值的数量,则可以设置area == 1

colSums(area == 1)

如果你有更复杂的计算,你也可以使用apply来逐列迭代函数(或逐行,参见?apply)以供将来参考

apply(area, 2, function(x) sum(x == 1))
mean_area <- mean(apply(area, 2, function(x) sum(x == 1)))

例如

area <- as.data.frame(matrix(sample(c(0,1), replace=TRUE, 50), 5, 10))
colnames(area) <- paste0("X", 1:ncol(area))

area$X1 == 1 # gives TRUE, FALSE, which is equivalent to 1, 0 and can be summed to get the number of 1's
# [1] FALSE FALSE  TRUE FALSE  TRUE
sum(area$X1)
# [1] 2

答案 1 :(得分:0)

您的回答非常有帮助。我最终制定了以下代码

for (i in 1:length(uniqueID)){
b<-apply(area[i],1,function(x) sum(x == 1))
c<-c+sum(b)
}
mean<-c/length(uniqueID)

非常感谢! 但有没有办法计算每个ID的面积方差?