如何在R中的循环中对数据进行子集化?

时间:2016-10-23 14:01:14

标签: r

我试图在R中编写一个对数据集具有相同影响的循环,如下代码所示:

AD1 <- subset(data, AD1==1)
AD2 <- subset(data, AD2==1)
AD3 <- subset(data, AD3==1)
AD4 <- subset(data, AD4==1)
AD5 <- subset(data, AD5==1)

经过几次尝试之后,我就陷入了困境:

for (i in 1:5) {
  adNum <- paste("AD", i, sep="")
  aSubset <- paste(adNum, " <- subset(data, ", adNum, "==1)", sep="")
  aSubset
}

理想情况下,我希望能够应用相同的原则来循环所有5个子集的代码:

uAD1 <- mean(AD1$u)
vAD1 <- mean(AD1$v)
wAD1 <- mean(AD1$w)
xAD1 <- mean(AD1$x)
yAD1 <- mean(AD1$y)
zAD1 <- mean(AD1$z)

3 个答案:

答案 0 :(得分:2)

这听起来像你在&#34; split-apply-combine&#34;区域:您希望将大型数据集切割为子集,并将相同的操作应用于这些子集(或这些子集的不同列)。虽然使用循环代码和解析的评估本身本身是错误的,但这种方法往往很脆弱(如果发生微妙的变化就会中断),容易出错,并且难以阅读。

R具有aggregatelapply/vapply等功能,可用于这些目的。现在还有几个成熟的R软件包可以帮助一个人完成这些类型的操作(查看 data.table tidyverse 软件包)。

考虑&#34;钻石&#34;数据集(随 tidyverse 包附带)。前几行看起来像这样:

  carat       cut color clarity depth table price    x    y    z
1  0.23     Ideal     E     SI2  61.5    55   326 3.95 3.98 2.43
2  0.21   Premium     E     SI1  59.8    61   326 3.89 3.84 2.31
3  0.23      Good     E     VS1  56.9    65   327 4.05 4.07 2.31
4  0.29   Premium     I     VS2  62.4    58   334 4.20 4.23 2.63
5  0.31      Good     J     SI2  63.3    58   335 4.34 4.35 2.75
6  0.24 Very Good     J    VVS2  62.8    57   336 3.94 3.96 2.48 

假设我们想要每种切割类型的平均深度,表格和价格。在基数R中,您可以使用aggregate

data.agg <- aggregate(diamonds[c('depth', 'table', 'price')], by = diamonds['cut'], FUN = mean)

        cut    depth    table    price
1      Fair 64.04168 59.05379 4358.758
2      Good 62.36588 58.69464 3928.864
3 Very Good 61.81828 57.95615 3981.760
4   Premium 61.26467 58.74610 4584.258
5     Ideal 61.70940 55.95167 3457.542

或使用tidyverse的 dplyr 包进行数据处理:

library(dplyr)

data.dplyr <- diamonds %>% 
    group_by(cut) %>% 
    select(depth, table, price) %>% 
    summarize_all(mean)

        cut    depth    table    price
      <ord>    <dbl>    <dbl>    <dbl>
1      Fair 64.04168 59.05379 4358.758
2      Good 62.36588 58.69464 3928.864
3 Very Good 61.81828 57.95615 3981.760
4   Premium 61.26467 58.74610 4584.258
5     Ideal 61.70940 55.95167 3457.542

虽然 dplyr 比基本aggregate函数(更多类型)更详细,但它更灵活,允许更高级的数据操作和汇总操作。请注意,两个版本都比循环替代版本更简洁,易于阅读和遵循。

答案 1 :(得分:0)

vapply

似乎是你需要的功能。

答案 2 :(得分:0)

我建议尝试使用以下代码中的内容,根据需要进行修改,具体取决于您想要的输出结构。

{{'2016-10-21T13:47:02.922452'| IST}}
相关问题