如何在R循环中计算行的平均值和中位数,并将其添加到数据帧中
我有一个数据框,每行有受试者,每行有变量,问题是每个受试者有40行,因为每个受试者有40个试验,所以不是每行对应每个受试者 我希望有一个新的数据框架,每行包含一个主题,并在列中包含一些变量的平均值和中位数 不幸的是,我对R和泛型编程语言还比较陌生,因为我从来没有管理过一个for循环来工作,我想这里我需要一些类似的东西 有人能建议一些方法吗 这是我的数据如何在R循环中计算行的平均值和中位数,并将其添加到数据帧中,r,for-loop,dataframe,R,For Loop,Dataframe,我有一个数据框,每行有受试者,每行有变量,问题是每个受试者有40行,因为每个受试者有40个试验,所以不是每行对应每个受试者 我希望有一个新的数据框架,每行包含一个主题,并在列中包含一些变量的平均值和中位数 不幸的是,我对R和泛型编程语言还比较陌生,因为我从来没有管理过一个for循环来工作,我想这里我需要一些类似的东西 有人能建议一些方法吗 这是我的数据 Subject Trial File Int Target Synchrony corr_ans
Subject Trial File Int Target Synchrony corr_ans Risposta ACC RT
8 1 8 sinc2_lab579.wmv ASD sinc si 1 5 1 1418
9 1 9 asinc12_lab612.wmv ASD asinc no 0 1 1 1313
10 1 10 asinc9_lab879.wmv ASD asinc no 0 1 1 1460
11 1 11 asinc3_con13.wmv TD asinc no 0 2 1 2330
12 1 12 sinc11_con13.wmv TD sinc si 1 3 0 2003
13 1 13 sinc4_lab879.wmv ASD sinc si 1 5 1 2334
谢谢
毛罗继续接受阿南达·马托的建议。 下面是聚合函数的一个简单示例:
> y
[,1] [,2] [,3]
[1,] 417.0761 3.656920 1
[2,] 549.2227 1.279305 1
[3,] 617.8346 2.676573 2
[4,] 445.3850 3.646215 2
[5,] 451.8529 4.337643 1
[6,] 391.7912 3.995142 2
# get mean and median by group (column 3 of y)
y.mean <- aggregate(y[,1:2], by=list(y[,3]), mean)
y.median <- aggregate(y[,1:2], by=list(y[,3]), median)
# merge y.mean and median by group, and label with suffix
y.summary <- merge(y.mean, y.median,by='Group.1', suffixes=c('mean','median'))
# print out result
print(summary)
Group.1 V1mean V2mean V1median V2median
1 1 472.7172 3.091289 451.8529 3.656920
2 2 485.0036 3.439310 445.3850 3.646215
继续阿南达·马托的建议。 下面是聚合函数的一个简单示例:
> y
[,1] [,2] [,3]
[1,] 417.0761 3.656920 1
[2,] 549.2227 1.279305 1
[3,] 617.8346 2.676573 2
[4,] 445.3850 3.646215 2
[5,] 451.8529 4.337643 1
[6,] 391.7912 3.995142 2
# get mean and median by group (column 3 of y)
y.mean <- aggregate(y[,1:2], by=list(y[,3]), mean)
y.median <- aggregate(y[,1:2], by=list(y[,3]), median)
# merge y.mean and median by group, and label with suffix
y.summary <- merge(y.mean, y.median,by='Group.1', suffixes=c('mean','median'))
# print out result
print(summary)
Group.1 V1mean V2mean V1median V2median
1 1 472.7172 3.091289 451.8529 3.656920
2 2 485.0036 3.439310 445.3850 3.646215
因为我不知道您的数据帧是什么样子,所以我创建了一个简单的示例数据。下面是使用dplyr的另一种方法
因为我不知道您的数据帧是什么样子,所以我创建了一个简单的示例数据。下面是使用dplyr的另一种方法
将data.table与@jazzurro示例数据一起使用:
> library(data.table)
> foodt = data.table(foo)
> foodt[,list(mean.rt=mean(rt), median.rt=median(rt), mean.rt2=mean(rt2), median.rt2=median(rt2)),by=id]
id mean.rt median.rt mean.rt2 median.rt2
1: 1 0.8370809 0.7547919 0.8533929 0.8363765
2: 2 0.8050453 0.8131681 0.9579030 1.0284944
3: 3 0.8221798 0.8210501 0.9458442 1.0073267
4: 4 0.8491232 0.8463559 0.9728266 0.9574839
5: 5 0.7617457 0.7176411 0.9349860 0.9857195
6: 6 0.5956108 0.4745952 0.9008883 0.9105738
7: 7 0.8396380 0.7679036 0.8994247 0.9631958
8: 8 0.7882674 0.7532493 0.8935340 0.8600171
9: 9 0.8827633 0.9542983 0.9341739 0.8908895
10: 10 0.7579038 0.7140594 0.9200357 0.8963950
由于未使用set.seed,结果与@jazzurro结果不同。使用data.table和@jazzurro样本数据:
> library(data.table)
> foodt = data.table(foo)
> foodt[,list(mean.rt=mean(rt), median.rt=median(rt), mean.rt2=mean(rt2), median.rt2=median(rt2)),by=id]
id mean.rt median.rt mean.rt2 median.rt2
1: 1 0.8370809 0.7547919 0.8533929 0.8363765
2: 2 0.8050453 0.8131681 0.9579030 1.0284944
3: 3 0.8221798 0.8210501 0.9458442 1.0073267
4: 4 0.8491232 0.8463559 0.9728266 0.9574839
5: 5 0.7617457 0.7176411 0.9349860 0.9857195
6: 6 0.5956108 0.4745952 0.9008883 0.9105738
7: 7 0.8396380 0.7679036 0.8994247 0.9631958
8: 8 0.7882674 0.7532493 0.8935340 0.8600171
9: 9 0.8827633 0.9542983 0.9341739 0.8908895
10: 10 0.7579038 0.7140594 0.9200357 0.8963950
由于未使用set.seed,结果与@jazzurro Results不同。如果要聚合的列很多,data.table中的另一个选项是:
library(data.table) # using data.table_1.9.5, though it should work with earlier versions
nm1 <- c("Risposta", "RT") # subset of `colnames` of `mydf` from which `mean`, `median` etc are calculated.
在上面的代码setDTmydf中,将data.frame对象转换为data.table。然后使用逻辑指示符Synchrony=='si'仅对条件为TRUE的行应用该函数。SD表示数据表的子集。当我们指定.SDcols并使用lappy.SD,..时,它正在创建一个包含nm1或.SDcols=nm1中指定的列的列表。如果您有多个函数,请使用list将其连接起来,即listmean=meanx,na.rm=TRUE,median=medianx,na.rm=TRUE,最后使用do unlistlapply..,as.list以获得宽格式的结果
数据
如果要聚合的列很多,data.table中的另一个选项是:
library(data.table) # using data.table_1.9.5, though it should work with earlier versions
nm1 <- c("Risposta", "RT") # subset of `colnames` of `mydf` from which `mean`, `median` etc are calculated.
在上面的代码setDTmydf中,将data.frame对象转换为data.table。然后使用逻辑指示符Synchrony=='si'仅对条件为TRUE的行应用该函数。SD表示数据表的子集。当我们指定.SDcols并使用lappy.SD,..时,它正在创建一个包含nm1或.SDcols=nm1中指定的列的列表。如果您有多个函数,请使用list将其连接起来,即listmean=meanx,na.rm=TRUE,median=medianx,na.rm=TRUE,最后使用do unlistlapply..,as.list以获得宽格式的结果
数据
如果每个主题都没有可用的指标变量,则需要为每个主题添加一个指标变量,然后查看R中的许多聚合函数中的一个,其中一个函数称为聚合。发布一个小样本数据将非常有用。我想您留下了您的评论作为答案。你可能想改变这一点。答案部分不是针对你的一般想法/哲学问题,您可以使用评论部分进行此操作。如果没有可用的指标变量,您需要为每个主题添加一个指标变量,然后查看R中的许多聚合函数之一,其中一个函数称为聚合。发布一个小样本数据将非常有帮助。我想您留下了您的评论作为答案。你可能想改变这一点。答案部分不适用于你的一般想法/哲学问题,你可以使用评论部分
mydf <- structure(list(Subject = c(1L, 1L, 1L, 1L, 1L, 1L), Trial = 8:13,
File = c("sinc2_lab579.wmv", "asinc12_lab612.wmv", "asinc9_lab879.wmv",
"asinc3_con13.wmv", "sinc11_con13.wmv", "sinc4_lab879.wmv"
), Int = c("ASD", "ASD", "ASD", "TD", "TD", "ASD"), Target = c("sinc",
"asinc", "asinc", "asinc", "sinc", "sinc"), Synchrony = c("si",
"no", "no", "no", "si", "si"), corr_ans = c(1L, 0L, 0L, 0L,
1L, 1L), Risposta = c(5L, 1L, 1L, 2L, 3L, 5L), ACC = c(1L,
1L, 1L, 1L, 0L, 1L), RT = c(1418L, 1313L, 1460L, 2330L, 2003L,
2334L)), .Names = c("Subject", "Trial", "File", "Int", "Target",
"Synchrony", "corr_ans", "Risposta", "ACC", "RT"), class = "data.frame", row.names = c("8",
"9", "10", "11", "12", "13"))