【问题标题】:Multiple subsets with unique counts and sums in RR中具有唯一计数和总和的多个子集
【发布时间】:2015-11-07 23:06:06
【问题描述】:

我有一个超出我技能水平的编码问题。我希望有人可以帮助我,为我指明完成这项任务所需的工具的方向。

我正在尝试创建一个独特物种数量的图~虚构岛屿的累积面积。我的图上的第一点将是岛上 1 的物种数量,第二点将是岛上 1 和 2 上的物种累积数量,第三点将是岛上 1,2 上的物种累积数量,& 3等

我总共有 30 个岛屿,我的数据是这样的:

species=c("ted", "ben", "ira", "nic", "meg", "ira", "nic", "ted", "ben", "kim" )
island=c(1,1,1,2,2,2,2,3,3,3)
size=c(10,10,10,20,20,20,20,30,30,30)
dat=data.frame(species, island, size)

到目前为止,我最好的方法是这样做:

A=subset(dat, island="1", select=c(name, size)))
B=subset(dat, island%in% c("1", "2"), select=c(name, size))
C=subset(dat, island%in% c("1", "2", "3"), select=c(name, size))

然后我可以使用 length() 和 unique() 函数来计算每个虚构岛屿(A、B、C 等)上的物种数量。我还需要找出每个虚构的累积岛的面积(在这种情况下,A 的大小为 10,B 的大小为 30,C 的大小为 60)。

Alength=length(unique(A$species))
Asum=sum(unique(A$size)))
Blength=length(unique(B$species))
Bsum=sum(unique(B$size)))
Clength=length(unique(C$species))
Csum=sum(unique(C$size)))

但这对于 30 个岛屿来说会变得非常乏味,我想学习以正确的方式去做。

因此,最终产品将是一组新的虚构岛屿,其中包含许多物种和一个区域。比如:

imaginaryisland=c("A","B","C")
numberofspecies=c(3,5,6) 
size=c(10, 30, 60)

任何帮助我指出正确的方向将不胜感激!

【问题讨论】:

    标签: r plot subset


    【解决方案1】:

    这是一种方法,它将物种的累积数量计算为每个岛屿上非重复物种名称的累积数量的最大值:

    data.frame(island=unique(dat$island),
               nspecies=tapply(cumsum(!duplicated(dat$species)), dat$island, max),
               size=unique(dat[, c('island', 'size')]$size))
    
    ##   island nspecies area
    ## 1      1        3   10
    ## 2      2        5   20
    ## 3      3        6   30
    

    【讨论】:

    • 谢谢。我在我的真实数据集上进行了尝试,但没有成功,但你教会了我一些我可以玩的新论点。这种方法看起来可以让我获得运行累积物种总数所需的独特价值,但不能获得面积。不过对于面积来说有点棘手,因为这些值不是唯一的(即,有多个相同大小的岛。我可以使用 cumsum() 命令将这部分作为独立计算来完成。再次感谢!
    • 我使用 cumsum() 生成了一个向量,表示岛屿区域的运行累积总数。我无法让代码为我的数据工作。事实上,我只是在我为这个问题生成的测试数据上尝试过它,它也不起作用。我收到一个错误:tapply(cumsum(!duplicated(dat$species)), dat$island, max) 中的错误:参数必须具有相同的长度所以我仍在试图弄清楚如何获得累计数的总和随着岛屿的增加,独特的物种。
    • 我已经得到了我需要工作的部分代码。我需要使用的最重要的计算是您在上面为“nspecies”编写的计算。我已经让它对我的数据中的重复项执行 cumsum() ,但它似乎不是从向量中的第一个岛开始的。计算发生的顺序很重要。
    • @eyerah 我的建议并不认为大小在各个岛屿上都是独一无二的。 unique(dat[, c('island', 'size')]$size 采用 islandsize 的唯一组合。该结果的size 列应给出岛屿的大小。另一种方法是merge 数据帧。您来自cumsum 的错误表明dat$species 的长度与dat$island 的长度不同,这对于数据框来说是不正确的。这让我认为您的示例数据并不能真正反映您的实际数据。
    • 非常感谢您的帮助。我现在知道了!
    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多