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

extract characters from a list of names and make it a numeric command

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

例如。区域 $X1 是 0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0 我想统计area$X1中1的个数,所以用了命令

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

这给了我 1504

这会给出1的个数,从而得到缓冲区的大小。

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

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

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

虽然我得到了我想要的名称列表,但 "names" 中元素的 class 是字符。

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

"area$X1" 不再是我想要的数字。要补充一点,现在如果我尝试命令:

 table(names[1])
     area$X1 
              1 

它不会是 0 和 1 的 table。它只包含一个元素,即名称 "area$X1"。

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

谁能帮我解决这个问题? 谢谢!!!

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

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

你的回答很有帮助。我最终制定了以下代码

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的面积方差?