R将函数应用于数据帧的子集

时间:2018-08-10 22:21:42

标签: r apply

浏览了有关该主题的几篇文章,但找不到解决方案。 我有以下使用data <- structure(list(Person = 1:3, Statute = c("21 O.S. 1", "21 O.S. 14", "22 O.S. 3"), Statute2 = c("22 O.S. 3", NA, NA)), .Names = c("Person", "Statute", "Statute2"), class = "data.frame", row.names = c(NA, -3L)) 遍历整个数据帧的代码。

apply()

但是我想基于列的值而不是整个数据集来遍历子集。

例如,我有一个变量pclm <- data.frame(apply(B01001_AGE[6:23], 1, function(x){ pclm <- pclm(x=seq(0,85,by=5), y=c(x), nlast=26, control = list(lambda = NA, deg = 3, kr = 1)) #nlast=26, assuming the oldest people alive are 110 years of age, 85+26=111. round(fitted(pclm)) })) ,我想在sumlev时将我的代码用于子集。

不生成数据集的子集怎么办?谢谢。

1 个答案:

答案 0 :(得分:1)

我怀疑您在问如何将功能应用于子集而不会撕裂数据框。正确吗?

在这种情况下,答案很简单:将函数应用于子集,然后将返回值重新分配给数据框的子集。例如,考虑一下:

原文:

mtcars[5:10, 2:3]
                  cyl  disp
Hornet Sportabout   8 360.0
Valiant             6 225.0
Duster 360          8 360.0
Merc 240D           4 146.7
Merc 230            4 140.8
Merc 280            6 167.6

将函数应用于子集:

mtcars[5:10, 2:3] = t(apply(mtcars[5:10, 2:3], 1, function(x) x*x ))

让我们看一下子集:

mtcars[5:10, 2:3]
                  cyl      disp
Hornet Sportabout  64 129600.00
Valiant            36  50625.00
Duster 360         64 129600.00
Merc 240D          16  21520.89
Merc 230           16  19824.64
Merc 280           36  28089.76

如果您正在寻找根据条件选择行的简单方法,请考虑以下问题:

mask <- mtcars["carb"]>3
head(mtcars[mask,])
                     mpg cyl      disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6    160.00 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6    160.00 110 3.90 2.875 17.02  0  1    4    4
Duster 360          14.3  64 129600.00 245 3.21 3.570 15.84  0  0    3    4
Merc 280            19.2  36  28089.76 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6    167.60 123 3.92 3.440 18.90  1  0    4    4