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