【问题标题】:extracting complex subset from dataframe in R从R中的数据框中提取复杂子集
【发布时间】:2013-01-13 05:15:18
【问题描述】:

我有一个这样的数据集:

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 和类似功能,但无法获得这种特定的输出格式。有人可以帮忙吗?

提前致谢

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

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

    1. 您建议的确切输出。

    2. 每个类别的方法(您提供的输出只是到达那里的一种方法)

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

    1。您建议的输出

    这里的问题是您有多个包含多个元素的组。所以首先,我们需要对元素进行分组(使用@Maiasaura 的解决方案here)。

    library(plyr)
    testgroups <- ddply(testdata, .(labels, patids), function(x) { x$group <- 1:nrow(x); x })
    

    然后我们可以适当地重塑它们:

    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
    

    【讨论】:

      【解决方案2】:

      只需将每个类别的mean直接用tapply取,这是为不规则数组制作的:

      tapply(testdata$dbins, interaction(testdata$labels, testdata$patid, drop=TRUE), FUN=mean)
      ## INF0.16186 SUP0.16186 SUP1.16186 INF0.18185 SUP0.18185 SUP1.18185 INF0.54234 SUP1.54234 
      ##        0.5        0.5        0.5        0.5        0.4        0.2        0.4        0.4 
      

      【讨论】:

      • 还有:tapply(testdata[,"dbins"], testdata[c("patids","labels")], FUN=mean)
      【解决方案3】:

      我想获得变量 dbins 的平均值(平均值接管了所有唯一的“patids”变量

      使用data.table

      R) library(data.table)
      R) testdata=as.data.table(testdata)
      R) testdata
          patids labels dbins vprobs Response
       1:  16186   SUP0   0.0    100        1
       2:  16186   SUP0   0.2     99        1
       3:  16186   SUP0   0.4     95        1
      ---
      40:  16186   SUP1   0.6     10        1
      41:  16186   SUP1   0.8     22        1
      42:  16186   SUP1   1.0      0        1
          patids labels dbins vprobs Response
      
      R) testdata[,list(dbins=mean(dbins)),by="patids"]
         patids dbins
      1:  16186   0.5
      2:  18185   0.4
      3:  54234   0.4
      

      【讨论】:

      • 几乎,但它没有回答问题中的微妙之处(必需的输出),iiuc。
      【解决方案4】:

      直接表示方法:

      > require(data.table)
      > testdata <- as.data.table(testdata)
      > testdata[, mean(dbins), by=c("patids","labels")]
         patids labels  V1
      1:  16186   SUP0 0.5
      2:  18185   SUP0 0.4
      3:  54234   INF0 0.4
      4:  18185   INF0 0.5
      5:  16186   INF0 0.5
      6:  54234   SUP1 0.4
      7:  18185   SUP1 0.2
      8:  16186   SUP1 0.5
      > 
      

      【讨论】:

        猜你喜欢
        • 2015-10-04
        • 2016-11-21
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-24
        • 1970-01-01
        相关资源
        最近更新 更多