gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:48:06 25 4
gpt4 key购买 nike

<分区>

我在网上广泛查看,但没有看到这个特定问题的答案(我认为)。

对我来说,最好的 self 解释方式是使用一些代码来重现我的问题。我做了一些临时数据:

x <- runif(100,1,2)
y <- runif(100,2,3)

z <- c(rep(1,100))
temp <- cbind(x,y,z)

temp[1:25,3] = temp[1:25,3] +2

temp <- as.data.frame(temp)

这就是 temp 的样子

         x        y   z
1 1.512620 2.552271 3
2 1.133614 2.455296 3
3 1.543242 2.490120 3
4 1.047618 2.069474 3
. . . .
. . . .
27 1.859012 2.687665 1
28 1.231450 2.196395 1

它一直持续到数据帧的末尾(100 行)。

我想做的是将函数应用于数据框,但应用于数据的子集。因此,例如,我想在 z=3 时将函数均值应用于列 x 和 y,并在 z=1 时将函数均值应用于列 x 和 y。所以我最终会得到 4 个值:当 z=1 和 z=3 时 x 的平均值以及当 z=1 和 z=3 时 y 的平均值。对于我的实际数据集,当 z= 某个值时的行数变化很大。

我一直在使用以下有效的代码;然而,这让我感到非常不安,因为我觉得代码可以更高效并且最好避免 for 循环。

x <- c(unique(temp$z))

我使用它 ^^ 来获取唯一的 z 值(在本例中为 z=3 和 z=1)。

for(i in x){
assign(paste("newdata",i,sep=""),subset(temp[which(temp$z==i),],select=c("x","y")))
}

所以我现在有两个新数据框 newdata1 和 newdata3,它们的行数不同。 newdata1 是 z=1 时的所有值,newdata3 是 z=3 时的所有值。

library(gdata)

blah <-cbindX(newdata1,newdata3)

我再次使用 cbindX 将子集数据合并到一个大数据框中。我不确定我为什么要这样做(我很久以前就写了这段代码)。我只记得这是我在使用上面的 for 循环时让它工作的唯一方法。代码的主要问题是当我有多个 z 值时,手动输入该列表变得非常麻烦。如果 z 的范围从 1 到 50,那么用户将键入 newdata1、newdata2、newdata3 .... 等等。

但是...它确实有效:

summ.test <- apply(blah,2,function(x) { 
c(min(x,na.rm=TRUE),median(x,na.rm=TRUE),max(x,na.rm=TRUE),sum(!is.na(x)))})

x y x y
[1,] 1.028332 2.018162 1.012379 2.009595
[2,] 1.509049 2.504000 1.427981 2.455296
[3,] 1.992704 2.998483 1.978359 2.970695
[4,] 75.000000 75.000000 25.000000 25.000000

所以我有效地做的是创建一个新的数据框,其中包含我之前从子集化的值,并将感兴趣的函数应用于它们。所以第一行是:当 z=1 时 x 的平均值,当 z=1 时 y 的平均值,当 z=3 时 x 的平均值,当 z=3 时 y 的平均值。

应该相当明显的主要问题:对数据框进行子集化的 for 循环方法会导致比我希望的更多的问题。有什么建议可以完全避免这种情况并最终得到相同的结果吗?

请让我知道这是否令人困惑,或者我的代码是否很草率!仍在处理此网站上的问题格式......

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com