Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.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 - Fatal编程技术网

R-从数据帧中该组的每个元素中减去该组的平均值

R-从数据帧中该组的每个元素中减去该组的平均值,r,R,我正在尝试将向量“means”合并到数据帧。 我的数据框看起来像这样 我首先使用以下命令计算了不同组(1组=总体+温度+大小+复制)的所有平均值: means<-aggregate(TL ~ Population + Temperature + Replicat + Size + Measurement, data=growth, list=growth$Name, mean) 我们只对测量1的方法感兴趣。对于dataframe中的每个个体,我想在测量值1处对其所属组的平

我正在尝试将向量“means”合并到数据帧。 我的数据框看起来像这样

我首先使用以下命令计算了不同组(1组=总体+温度+大小+复制)的所有平均值:

means<-aggregate(TL ~ Population + Temperature + Replicat + Size + Measurement, data=growth, list=growth$Name, mean)        
我们只对测量1的方法感兴趣。对于dataframe中的每个个体,我想在测量值1处对其所属组的平均值进行细分:在本例中(请参见带有R命令的dataframe): -对于JUB+15+测量1组,平均值=12 -对于JUB+20+测量1组,平均值=15.66

growth<-data.frame(Population=c("JUB", "JUB", "JUB","JUB", "JUB", "JUB","JUB", "JUB", "JUB","JUB", "JUB", "JUB","JUB", "JUB", "JUB","JUB", "JUB", "JUB"), Measurement=c("1","1","1","1","1","1","2","2","2","2","2","2", "3", "3", "3", "3", "3", "3"),Temperature=c("15","15","15","20", "20", "20","15","15","15","20", "20", "20","15","15","15","20", "20", "20"),TL=c(11,12,13,15,18,14, 16,17,20,21,19,16, 25,22,24,26,24,23), New_TL=c("11-12", "12-12", "13-12", "15-15.66", "18-15.66", "14-15.66", "16-12", "17-12", "20-12", "21-15.66", "19-15.66", "16-15.66", "25-12", "22-12", "24-12", "26-15.66", "24-15.66", "23-15.66"))    
print(growth)

growth您是否考虑过使用
data.table
包?它非常适合于执行您描述的此类分组、筛选、加入和聚合操作,从长远来看可能会为您节省大量时间

下面的代码显示了与您描述的工作流类似但基于内置的
mtcars
数据集的工作流使用
data.table
时的外观

需要说明的是,还有一些方法可以使用base
R
以及其他软件包(如
dplyr
)来实现您所描述的,只是根据我发现对我的个人工作最有用的内容提出了一个建议

库(data.table)
##将mtcars转换为data.table
##为简洁起见,仅包括“mpg”、“cyl”、“am”和“gear”列

DT考虑
by
按因子对数据帧进行子集划分(但为了比较第1组和所有其他组,请忽略测量)。然后,对所需列运行
ifelse
条件逻辑计算。由于
by
将返回数据帧列表,因此使用
do.call()绑定所有外部数据帧:


这里有一个带有
tidyverse
的选项。按组列分组后,使用
mutate_at
指定感兴趣的列,并获得该列(
)与该列的
平均值的差值

library(tidyverse)
growth %>% 
       group_by(Population, Temperature, Replicat, Size, Measurement) %>% 
       mutate_at(vars(HL, TL), funs(MeanGroupDiff = . 
                  - mean(.[Measurement == 1])))
使用带有
mtcars
dataset的可复制示例

data(mtcars)
mtcars %>%
   group_by(cyl, vs) %>% 
   mutate_at(vars(mpg, disp), funs(MeanGroupDiff = .- mean(.[am==1])))

请设置一个可复制的示例(无屏幕截图),以显示所需的结果。感谢您的回复。这个命令有效。然而,通过这样做,我得到了一个新的列,即数据帧的每个元素与其组的平均值之间的差异(即在本例中为总体+温度+复制+大小+测量)。我需要的是将测量值1(当我第一次测量个体时)的每个组的平均值代入数据帧的每个元素,仍然基于它们所属的组,但测量值2、3和4除外。实际上,这是为了在实验开始时对TL(总长度)进行“修正”。我几乎知道这并不完全是你需要的,因此我在你的帖子下面发表了我的评论。请用实际的当前数据和期望的结果显示,而不是仅仅说明。请参阅:。我试图树立一个榜样。我在描述中添加了它、解释和代码。我希望你能帮我解决这个问题。非常感谢!这个很好用。我可以为整张桌子做。顺便问一下,你知道如何做同样的事情,但有一些价值观吗?事实上,从另一个表中,我需要根据每个个体的总体将3个不同的值(对于3个不同的群体)代入每个个体。例如,对于人口JUB中的个体,我需要减去该人口的某个值,即12;对于人口ZHA中的个体,我需要为每个个体减去15;对于SEB群体中的个体,我需要将14分为每个个体。听起来不错。很乐意帮忙!一定要注意这种说法!谢谢你的回复。我意识到我的帖子不够清晰,并澄清了上面的描述。对于数据帧中的每个个体,我想用测量值1计算出的其所属组的平均值来代替。我在上面举了一个例子。我尝试了您提供的代码来添加means列,但它对我不起作用。我收到了这个错误消息:
[.data.table
(growth2,
:=
(means\u groups,means(“TL”)),keyby=。(“Population”):“by”或“keyby”列表中的项目是长度(1,1,1,1,1)。每个项目的长度必须与x中的行或I返回的行数相同(3365)。谢谢你的回复。我意识到我的帖子不够清晰,并澄清了我的上述描述。对于数据框中用于计算平均值(总体+温度+大小+复制+测量)的各组中的每个个体,我想将其分为各组中的每个个体(总体+温度+大小+复制+测量)测量1时组的平均值(总体+温度+大小+重复,测量1).所以在现实中,我想要替代的并不是它所属组的平均值,而是在测量1时为组计算的平均值。这是为了在实验开始时控制大小。希望我的解释更清楚。我在上面举了一个例子,说明了我试图解释的内容。也许这会更容易理解tand.@Marine我不太清楚。你能检查一下更新后的解决方案
funs
在dplyr 0.8中是不推荐使用的。替换方法类似于
mutate\u at(vars(mpg,disp),.funs=list(MeanGroupDiff=.-mean([am==1])
,但在执行此操作时,我在check\u names\u df(I,x)中得到
错误:未找到对象“am”
@MaxGhenis它可能是
列表(MeanGroupDiff=.-mean([am==1])
growth<-data.frame(Population=c("JUB", "JUB", "JUB","JUB", "JUB", "JUB","JUB", "JUB", "JUB","JUB", "JUB", "JUB","JUB", "JUB", "JUB","JUB", "JUB", "JUB"), Measurement=c("1","1","1","1","1","1","2","2","2","2","2","2", "3", "3", "3", "3", "3", "3"),Temperature=c("15","15","15","20", "20", "20","15","15","15","20", "20", "20","15","15","15","20", "20", "20"),TL=c(11,12,13,15,18,14, 16,17,20,21,19,16, 25,22,24,26,24,23), New_TL=c("11-12", "12-12", "13-12", "15-15.66", "18-15.66", "14-15.66", "16-12", "17-12", "20-12", "21-15.66", "19-15.66", "16-15.66", "25-12", "22-12", "24-12", "26-15.66", "24-15.66", "23-15.66"))    
print(growth)
library(data.table)

## Convert mtcars to a data.table
## only include columns `mpg`, `cyl`, `am` and `gear` for brevity
DT <- as.data.table(mtcars)[, .(mpg, cyl,am, gear)]

## Take a subset where `cyl` is equal to 6
DT <- DT[cyl == 6]

## Calculate grouped mean based on `gear` and `am` as grouping variables
DT[,group_mpg_avg := mean(mpg), keyby = .(gear, am)]

## Calculate each row's difference from the group mean
DT[,mpg_diff_from_group := mpg - group_mpg_avg]

print(DT)

#     mpg cyl am gear group_mpg_avg mpg_diff_from_group
# 1: 21.4   6  0    3         19.75                1.65
# 2: 18.1   6  0    3         19.75               -1.65
# 3: 19.2   6  0    4         18.50                0.70
# 4: 17.8   6  0    4         18.50               -0.70
# 5: 21.0   6  1    4         21.00                0.00
# 6: 21.0   6  1    4         21.00                0.00
# 7: 19.7   6  1    5         19.70                0.00
df_list <- by(growth, growth[,c("Population", "Temperature")], function(sub) {
  # TL CORRECTION      
  sub$Correct_TL <- ifelse(sub$Measurement != 1, 
                           sub$TL - mean(subset(sub, Measurement == 1)$TL),
                           sub$TL)
  # ADD OTHER CORRECTIONS

  return(sub)  
})

final_df <- do.call(rbind, df_list)
final_df

#    Population Measurement Temperature TL   New_TL Correct_TL
# 1         JUB           1          15 11    11-12 11.0000000
# 2         JUB           1          15 12    12-12 12.0000000
# 3         JUB           1          15 13    13-12 13.0000000
# 7         JUB           2          15 16    16-12  4.0000000
# 8         JUB           2          15 17    17-12  5.0000000
# 9         JUB           2          15 20    20-12  8.0000000
# 13        JUB           3          15 25    25-12 13.0000000
# 14        JUB           3          15 22    22-12 10.0000000
# 15        JUB           3          15 24    24-12 12.0000000
# 4         JUB           1          20 15 15-15.66 15.0000000
# 5         JUB           1          20 18 18-15.66 18.0000000
# 6         JUB           1          20 14 14-15.66 14.0000000
# 10        JUB           2          20 21 21-15.66  5.3333333
# 11        JUB           2          20 19 19-15.66  3.3333333
# 12        JUB           2          20 16 16-15.66  0.3333333
# 16        JUB           3          20 26 26-15.66 10.3333333
# 17        JUB           3          20 24 24-15.66  8.3333333
# 18        JUB           3          20 23 23-15.66  7.3333333
library(tidyverse)
growth %>% 
       group_by(Population, Temperature, Replicat, Size, Measurement) %>% 
       mutate_at(vars(HL, TL), funs(MeanGroupDiff = . 
                  - mean(.[Measurement == 1])))
data(mtcars)
mtcars %>%
   group_by(cyl, vs) %>% 
   mutate_at(vars(mpg, disp), funs(MeanGroupDiff = .- mean(.[am==1])))