【问题标题】:R apply a function on a subset of a data frame [closed]R在数据框的子集上应用函数[关闭]
【发布时间】:2018-08-10 22:21:41
【问题描述】:

浏览了有关此主题的一些帖子,但找不到解决方案。 我有以下代码使用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,我想在sumlev=='050' 时将我的代码用于子集。

如果不生成数据集的子集,我怎么能做到这一点?谢谢。

【问题讨论】:

  • 我并不真正理解您希望如何在不生成数据集子集的情况下对数据集子集进行操作。你只想用B01001_AGE[B01001_AGE$sumlev == '050', 6:23]apply 来对付吗?
  • 我能想到的唯一想法是使用管道,但您仍然需要对数据进行子集化df %&gt;% subset(sumlev=='50') %&gt;% apply(., 1, function(x))
  • 如果我可能会问,您能否发布 a)您的数据的一个小示例,b)您要应用的功能(如果是 pclm,它来自哪个包?),以及输出你希望看到的?

标签: r apply


【解决方案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

【讨论】:

  • 谢谢。您的答案与@thelatemail 的相同,只是您的答案更长,哈哈
  • 我认为不同之处在于 thelatemail 假设您知道如何重新分配输出,但我不知道并且已经向您展示了。如果这不是您的问题,那么澄清您所面临的确切问题可能会很有用。
猜你喜欢
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
相关资源
最近更新 更多