gpt4 book ai didi

r - 从 R 中的数据帧中提取复杂的子集

转载 作者:行者123 更新时间:2023-12-04 23:58:06 24 4
gpt4 key购买 nike

我有一个像这样的数据集:

testdata <- read.table(header=T, text='
patids labels dbins vprobs Response
16186 SUP0 0.0 100 1
16186 SUP0 0.2 99 1
16186 SUP0 0.4 95 1
16186 SUP0 0.6 99 1
16186 SUP0 0.8 50 1
16186 SUP0 1.0 0 1
18185 SUP0 0.0 100 0
18185 SUP0 0.2 100 0
18185 SUP0 0.4 5 0
18185 SUP0 0.6 2 0
18185 SUP0 0.8 0 0
54234 INF0 0.0 100 1
54234 INF0 0.2 95 1
54234 INF0 0.4 90 1
54234 INF0 0.6 30 1
54234 INF0 0.8 0 1
18185 INF0 0.0 100 0
18185 INF0 0.2 20 0
18185 INF0 0.4 10 0
18185 INF0 0.6 5 0
18185 INF0 0.8 3 0
18185 INF0 1.0 0 0
16186 INF0 0.0 100 1
16186 INF0 0.2 100 1
16186 INF0 0.4 70 1
16186 INF0 0.6 60 1
16186 INF0 0.8 50 1
16186 INF0 1.0 0 1
54234 SUP1 0.0 100 1
54234 SUP1 0.2 95 1
54234 SUP1 0.4 90 1
54234 SUP1 0.6 30 1
54234 SUP1 0.8 0 1
18185 SUP1 0.0 100 0
18185 SUP1 0.2 50 0
18185 SUP1 0.4 0 0
16186 SUP1 0.0 100 1
16186 SUP1 0.2 100 1
16186 SUP1 0.4 40 1
16186 SUP1 0.6 10 1
16186 SUP1 0.8 22 1
16186 SUP1 1.0 0 1 ')

现在,对于每个“标签”,即 SUP0、SUP1 等,我想获得变量 dbins 的平均值(意思是接管所有唯一的“patids”变量。我面临的问题是“dbins”不是全部每个“patids”的长度相同。在采用这种方法之前,有没有办法用 NA 或 0 填充?我的预期输出必须是这样的:

对于 SUP0
labels dbins dbins.16186 dbins.18185
SUP0 0.0 0.0
SUP0 0.2 0.2
SUP0 0.4 0.4
SUP0 0.6 0.6
SUP0 0.8 0.8
SUP0 1.0 NA

对于 INF0
labels      dbins.54234 dbins.18185 dbins.16186
INF0 0.0 0.0 0.0 0.0
INF0 0.2 0.2 0.0 0.2
INF0 0.4 0.4 0.0 0.4
INF0 0.6 0.6 0.0 0.6
INF0 0.8 0.8 0.8 0.8
INFO NA 1.0 1.0 1.0

...这样我就可以在列上取平均值。

我一直在尝试使用 ddply 和类似的函数,但我无法获得这种特定的输出格式。有人可以帮忙吗?

提前致谢

最佳答案

您想要的答案可能是两件事之一。

  • 您建议的确切输出。
  • 每个类别的平均值(您提供的输出只是到达那里的一种方法)

  • 我将使用 plyr 和 reshape2,但毫无疑问@mnel 很快就会提供 data.table 解决方案。

    1. 你建议的输出

    这里的问题是您有多个包含多个元素的组。所以首先,我们需要对元素进行分组(使用@Maiasaura 的解决方案 here)。
    library(plyr)
    testgroups <- ddply(testdata, .(labels, patids), function(x) { x$group <- 1:nrow(x); x })

    然后我们可以正确地 reshape 它们:
    library(reshape2)
    testreshape <- dcast(testgroups[,c("labels", "patids", "dbins", "group")], labels+group~patids, value.var="dbins")

    labels group 16186 18185 54234
    1 INF0 1 0.0 0.0 0.0
    2 INF0 2 0.2 0.2 0.2
    3 INF0 3 0.4 0.4 0.4
    4 INF0 4 0.6 0.6 0.6
    5 INF0 5 0.8 0.8 0.8
    6 INF0 6 1.0 1.0 NA
    7 SUP0 1 0.0 0.0 NA
    8 SUP0 2 0.2 0.2 NA
    9 SUP0 3 0.4 0.4 NA
    10 SUP0 4 0.6 0.6 NA
    11 SUP0 5 0.8 0.8 NA
    12 SUP0 6 1.0 NA NA
    13 SUP1 1 0.0 0.0 0.0
    14 SUP1 2 0.2 0.2 0.2
    15 SUP1 3 0.4 0.4 0.4
    16 SUP1 4 0.6 NA 0.6
    17 SUP1 5 0.8 NA 0.8
    18 SUP1 6 1.0 NA NA

    从这里你可以使用类似 testreshape[testreshape$labels=="INF0",] 的东西

    2. 各类别的均值

    这要简单得多:
    library(plyr)
    testmeans <- ddply(testdata, .(labels, patids), summarise, mean=mean(dbins, na.rm=TRUE))

    labels patids mean
    1 INF0 16186 0.5
    2 INF0 18185 0.5
    3 INF0 54234 0.4
    4 SUP0 16186 0.5
    5 SUP0 18185 0.4
    6 SUP1 16186 0.5
    7 SUP1 18185 0.2
    8 SUP1 54234 0.4

    关于r - 从 R 中的数据帧中提取复杂的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14300897/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com