对数据框进行子集化,然后在 R 中的 for 循环中对每个子集应用数学问题

问题描述 投票:0回答:3

我一直在努力为此特定目的编写 for 循环,并且我有相当大的数据集,所以我想学习如何在 for 循环中执行此操作,因为替代方法是手动执行。

为了避免您详细了解我的具体数据,我将以这个可重现的数据框为例:

mydf<-data.frame(Factor = rep(c("level 1", "level 2", "level 3"), 4),
                  numeric = c(1:12))
 mydf
Factor numeric
1  level 1       1
2  level 2       2
3  level 3       3
4  level 1       4
5  level 2       5
6  level 3       6
7  level 1       7
8  level 2       8
9  level 3       9
10 level 1      10
11 level 2      11
12 level 3      12

我有一个分类(作为一个因素)和一个数值列,我希望能够对因素内各个水平的数值数据进行计算,或者至少问 R 是什么意思或标准偏差是针对每个级别的。比如属于“level 1”的数值数据的标准差是多少?

我之前没有使用循环来对数据进行子集/分组,所以我什至不知道从哪里开始。

提前感谢任何可以提供帮助的人

我尝试搜索有关堆栈溢出的答案,但找不到我需要的东西。我从人们需要在 for 循环中过滤数据框的几个不同问题中收集了一些想法。我试过了,但它只是打印了整个数据框 12 次,然后给出了整个数字列的标准偏差 12 次,而不是每个级别

    sd<-c()
    for (levels in mydf$Factor){
    a<-dplyr::filter(mydf, Factor == Factor)
    sd<-append(sd, sd(a$numeric))
    }
sd
     [1] 3.605551 3.605551 3.605551 3.605551 3.605551 3.605551 3.605551
     [8] 3.605551 3.605551 3.605551 3.605551 3.605551

我也根据我在堆栈溢出上找到的另一个答案尝试了这个:

output<-rep(NA,3)
names(output)<-levels(mydf$Factor)
for (i in 1:length(output)){
  sd[i]<- mean(subset(mydf, Factor == levels(mydf$Factor)[i])$numeric)
}
sd

但这给了我:

sd
 [1] 5.500000 6.500000 7.500000 3.605551 3.605551 3.605551 3.605551
 [8] 3.605551 3.605551 3.605551 3.605551 3.605551
r loops for-loop subset
3个回答
2
投票

为什么要为此使用循环? 您可以使用 dplyr(tidyverse 软件包集的一部分)

library(tidyverse)

mydf %>% group_by(Factor) %>% summarise(value=sd(numeric)) %>% View()

0
投票

根据 procerus 提供的答案,这对我有用。

mean<- mydf %>% group_by(Factor) %>% summarise(value=mean(numeric)) %>% data.frame()

sd<- mydf %>% group_by(Factor) %>% summarise(value=sd(numeric)) %>% data.frame()


standardised<-c()
for (i in 1:nrow(mydf)){
  if(mydf$Factor[i] == "level 1"){
    standardised<-append(standardised, (mydf$numeric[i]-mean[1,2])/sd[1,2])
  } else{
    
  } 
  if (mydf$Factor[i] == "level 2"){
    standardised<-append(standardised, (mydf$numeric[i]-mean[2,2])/sd[2,2])
  } else{
    
  } 
  if (mydf$Factor[i] == "level 3"){
    standardised<-append(standardised, (mydf$numeric[i]-mean[3,2])/sd[3,2])
  }
}
standardised

我绝对乐于接受有关更优雅的方法的建议。 谢谢:)


0
投票

如果我正确理解你想要什么,这将完成工作。

library(dplyr)

mydf1<-mydf %>% group_by(Factor) %>% mutate(sd=sd(numeric),
                                            mean=mean(numeric))

你真的不需要循环,而是学习 dplyr(或 data.table),它会让你的生活更轻松。

© www.soinside.com 2019 - 2024. All rights reserved.