Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R循环中计算行的平均值和中位数,并将其添加到数据帧中_R_For Loop_Dataframe - Fatal编程技术网

如何在R循环中计算行的平均值和中位数,并将其添加到数据帧中

如何在R循环中计算行的平均值和中位数,并将其添加到数据帧中,r,for-loop,dataframe,R,For Loop,Dataframe,我有一个数据框,每行有受试者,每行有变量,问题是每个受试者有40行,因为每个受试者有40个试验,所以不是每行对应每个受试者 我希望有一个新的数据框架,每行包含一个主题,并在列中包含一些变量的平均值和中位数 不幸的是,我对R和泛型编程语言还比较陌生,因为我从来没有管理过一个for循环来工作,我想这里我需要一些类似的东西 有人能建议一些方法吗 这是我的数据 Subject Trial File Int Target Synchrony corr_ans

我有一个数据框,每行有受试者,每行有变量,问题是每个受试者有40行,因为每个受试者有40个试验,所以不是每行对应每个受试者

我希望有一个新的数据框架,每行包含一个主题,并在列中包含一些变量的平均值和中位数

不幸的是,我对R和泛型编程语言还比较陌生,因为我从来没有管理过一个for循环来工作,我想这里我需要一些类似的东西

有人能建议一些方法吗

这是我的数据

    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"))