从名称列表中提取字符并使其成为数字命令
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的面积方差?
我有一个对象列表: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的面积方差?