【问题标题】:extract characters from a list of names and make it a numeric command从名称列表中提取字符并使其成为数字命令
【发布时间】:2017-02-26 18:36:42
【问题描述】:

我有一个对象列表:area$X1,area$X2,area$X3,area$X4, ...area$X100。每个对象的类都是数字的。这些对象是从 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: "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 组成的表格。它只包含一个元素,即名称“area$X1”。

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

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

【问题讨论】:

    标签: r class object character numeric


    【解决方案1】:

    如果您的区域只有 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
    

    【讨论】:

    • colSums 不起作用,因为 area 属于 SpaitalPiexelsDataFrame 类
    • apply 选项运气好吗?
    • 谢谢。应用功能有效。但是有没有办法计算每个 ID 的面积方差?
    • 考虑单例var(area$X1),使用apply逐列迭代函数apply(area, 2, function(x) var(x))或简称apply(area, 2, var)
    • 我想计算不同轨道 ID 之间的 Var。不在每个轨道内。为了简化我的问题,我不确定如何将循环中每个步骤的答案存储到数字列表中并计算它的方差。请参阅下面的答案以了解我的循环。
    【解决方案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 的面积方差?

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多