我一直在努力为此特定目的编写 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
为什么要为此使用循环? 您可以使用 dplyr(tidyverse 软件包集的一部分)
library(tidyverse)
mydf %>% group_by(Factor) %>% summarise(value=sd(numeric)) %>% View()
根据 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
我绝对乐于接受有关更优雅的方法的建议。 谢谢:)
如果我正确理解你想要什么,这将完成工作。
library(dplyr)
mydf1<-mydf %>% group_by(Factor) %>% mutate(sd=sd(numeric),
mean=mean(numeric))
你真的不需要循环,而是学习 dplyr(或 data.table),它会让你的生活更轻松。