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

ckocjqey  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(138)

我一直在努力为这个特定的目的写一个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每个水平的平均值或标准差是多少。例如,属于"水平1"的数值数据的标准差是多少?
我以前没有使用过for循环来对数据进行子集/分组,所以我甚至不知道从哪里开始。
提前感谢任何能提供帮助的人
我试着搜索堆栈溢出的答案,但找不到我需要的答案。我从几个不同的问题中收集了一些想法,人们需要在for循环中过滤 Dataframe 。我试着这样做,但它只是打印了12次整个 Dataframe ,然后给出了12次整个数值列的标准差,而不是每个级别的标准差
一个二个一个一个
我还根据我在这里找到的关于堆栈溢出的另一个答案尝试了这个方法:

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
wb1gzix0

wb1gzix01#

你为什么要用loop来做这个呢?你可以用dplyr(tidyverse包集的一部分)

library(tidyverse)

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

mzillmmw2#

根据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

我非常乐意接受关于更优雅的方法的建议。谢谢:)

相关问题