Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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_Loops_Dataframe - Fatal编程技术网

R 查找每个主题的值并另存为新表

R 查找每个主题的值并另存为新表,r,loops,dataframe,R,Loops,Dataframe,我有一个长格式数据的数据框,如下所示 ID Frame.No ROI.No Flux.med 01 1 1 78 01 1 2 76 01 2 1 80 01 2 2 80 01 3 1 89 01 3 2 80 27 1 1 60 27 1 2 68 27 4 1 80 27 4

我有一个长格式数据的数据框,如下所示

ID Frame.No ROI.No Flux.med
01 1        1      78
01 1        2      76
01 2        1      80
01 2        2      80
01 3        1      89
01 3        2      80
27 1        1      60
27 1        2      68
27 4        1      80
27 4        2      89
对于每个“ID”,我希望获得ROI 1和2的第一个和最大Flux.med,并将所有这些放在一个新的数据帧中。如果我有一个只包含一个主题(例如ID 01)的数据帧,我可以使用以下代码识别所需的Flux.med值:

ROI1.baseline <-  mydata %>%
    filter(ROI.No == "ROI 1" & Frame.No == min(Frame.No))%>%   
  select(Flux.Med)

ROI1.max <-  mydata%>%
     filter(ROI.No == "ROI 1")%>%
  filter (Flux.Med == max(Flux.Med))%>%
  select(Flux.Med)

ROI2.baseline <-  mydata%>%
  filter(ROI.No == "ROI 2" & Frame.No == min(Frame.No))%>%
  select(Flux.Med)

ROI.max <-  mydata%>%
   filter(ROI.No == "ROI 2")%>%
  filter (Flux.Med == max(Flux.Med))%>%
  select(Flux.Med)
ROI1.0%基线
过滤器(ROI.No==“ROI 1”和帧号==最小值(帧号))%>%
选择(Flux.Med)
ROI1.max%
过滤器(ROI.No==“ROI 1”)%>%
过滤器(通量.Med==最大(通量.Med))%>%
选择(Flux.Med)
投资回报率2.2%
过滤器(ROI.No==“ROI 2”&帧号==最小值(帧号))%>%
选择(Flux.Med)
ROI.max%
过滤器(ROI.No==“ROI 2”)%>%
过滤器(通量.Med==最大(通量.Med))%>%
选择(Flux.Med)
但我需要对每个ID执行此操作,并将结果保存在数据帧中


我可以用
for
循环来实现这一点吗?

我们可以在每个
ID
ROI中获得第一个和
最大值

library(dplyr)

mydata %>%
  group_by(ID, ROI.No) %>%
  summarise(first_flux = first(Flux.med), 
             max_flux = max(Flux.med))

#    ID ROI.No first_flux max_flux
#  <int>  <int>      <int>    <int>
#1     1      1         78       89
#2     1      2         76       80
#3    27      1         60       80
#4    27      2         68       89
数据

mydata <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 27L, 27L, 27L, 
27L), Frame.No = c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 4L, 4L), ROI.No = c(1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), Flux.med = c(78L, 76L, 80L, 
80L, 89L, 80L, 60L, 68L, 80L, 89L)), class = "data.frame", row.names = c(NA,-10L))

mydata我们可以在每个
ID
ROI.No
中获得第一个和
max

library(dplyr)

mydata %>%
  group_by(ID, ROI.No) %>%
  summarise(first_flux = first(Flux.med), 
             max_flux = max(Flux.med))

#    ID ROI.No first_flux max_flux
#  <int>  <int>      <int>    <int>
#1     1      1         78       89
#2     1      2         76       80
#3    27      1         60       80
#4    27      2         68       89
数据

mydata <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 27L, 27L, 27L, 
27L), Frame.No = c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 4L, 4L), ROI.No = c(1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), Flux.med = c(78L, 76L, 80L, 
80L, 89L, 80L, 60L, 68L, 80L, 89L)), class = "data.frame", row.names = c(NA,-10L))

mydata我们可以使用
data.table

library(data.table)
setDT(df1)[, .(first_flux = first(Flux.med), 
         max_flux = max(Flux.med)), .(ID, ROI.No)]
数据
df1我们可以使用
data.table

library(data.table)
setDT(df1)[, .(first_flux = first(Flux.med), 
         max_flux = max(Flux.med)), .(ID, ROI.No)]
数据
df1谢谢你的建议。我最后就是这样做的:

ROI1.baseline <-  ldi_data %>%
  group_by(ID)%>%
  filter(ROI.No == "ROI 1" & Frame.No == min(Frame.No))%>%   ###uses lowest number frame as baseline (not necessarily frame 1 if it was excluded)
  select(Flux.Med)%>%
  dplyr::rename(ROI1_baseline = Flux.Med)%>%
  as.data.frame(ROI1.baseline)

ROI1.max <-  ldi_data%>%
  group_by(ID)%>%
  filter(ROI.No == "ROI 1")%>%
  filter (Flux.Med == max(Flux.Med))%>%
  select(Flux.Med)%>%
  dplyr::rename(ROI1_max = Flux.Med)%>%
  as.data.frame(ROI1.max)

ROI2.baseline <-  ldi_data%>%
  group_by(ID)%>%
  filter(ROI.No == "ROI 2" & Frame.No == min(Frame.No))%>%
  select(Flux.Med)%>%
  dplyr::rename(ROI2_baseline = Flux.Med)%>%
  as.data.frame(ROI2.baseline)

ROI2.max <-  ldi_data%>%
  group_by(ID)%>%
  filter(ROI.No == "ROI 2")%>%
  filter (Flux.Med == max(Flux.Med))%>%
  select(Flux.Med)%>%
  dplyr::rename(ROI2_max = Flux.Med)%>%
  as.data.frame(ROI2.max)

summary <-   Reduce(merge, list(ROI1.baseline, ROI1.max, ROI2.baseline, ROI2.max))
ROI1.0%基线
分组依据(ID)%>%
过滤器(ROI.No==“ROI 1”和Frame.No==min(Frame.No))%>%\
选择(通量.Med)%>%
dplyr::重命名(ROI1_基线=通量.Med)%>%
as.data.frame(ROI1.基线)
ROI1.max%
分组依据(ID)%>%
过滤器(ROI.No==“ROI 1”)%>%
过滤器(通量.Med==最大(通量.Med))%>%
选择(通量.Med)%>%
dplyr::重命名(ROI1_max=Flux.Med)%>%
as.data.frame(ROI1.max)
投资回报率2.2%
分组依据(ID)%>%
过滤器(ROI.No==“ROI 2”&帧号==最小值(帧号))%>%
选择(通量.Med)%>%
dplyr::重命名(ROI2_基线=通量.Med)%>%
as.data.frame(ROI2.基线)
ROI2.max%
分组依据(ID)%>%
过滤器(ROI.No==“ROI 2”)%>%
过滤器(通量.Med==最大(通量.Med))%>%
选择(通量.Med)%>%
dplyr::重命名(ROI2_max=Flux.Med)%>%
as.data.frame(ROI2.max)

小结谢谢你的建议。我最后就是这样做的:

ROI1.baseline <-  ldi_data %>%
  group_by(ID)%>%
  filter(ROI.No == "ROI 1" & Frame.No == min(Frame.No))%>%   ###uses lowest number frame as baseline (not necessarily frame 1 if it was excluded)
  select(Flux.Med)%>%
  dplyr::rename(ROI1_baseline = Flux.Med)%>%
  as.data.frame(ROI1.baseline)

ROI1.max <-  ldi_data%>%
  group_by(ID)%>%
  filter(ROI.No == "ROI 1")%>%
  filter (Flux.Med == max(Flux.Med))%>%
  select(Flux.Med)%>%
  dplyr::rename(ROI1_max = Flux.Med)%>%
  as.data.frame(ROI1.max)

ROI2.baseline <-  ldi_data%>%
  group_by(ID)%>%
  filter(ROI.No == "ROI 2" & Frame.No == min(Frame.No))%>%
  select(Flux.Med)%>%
  dplyr::rename(ROI2_baseline = Flux.Med)%>%
  as.data.frame(ROI2.baseline)

ROI2.max <-  ldi_data%>%
  group_by(ID)%>%
  filter(ROI.No == "ROI 2")%>%
  filter (Flux.Med == max(Flux.Med))%>%
  select(Flux.Med)%>%
  dplyr::rename(ROI2_max = Flux.Med)%>%
  as.data.frame(ROI2.max)

summary <-   Reduce(merge, list(ROI1.baseline, ROI1.max, ROI2.baseline, ROI2.max))
ROI1.0%基线
分组依据(ID)%>%
过滤器(ROI.No==“ROI 1”和Frame.No==min(Frame.No))%>%\
选择(通量.Med)%>%
dplyr::重命名(ROI1_基线=通量.Med)%>%
as.data.frame(ROI1.基线)
ROI1.max%
分组依据(ID)%>%
过滤器(ROI.No==“ROI 1”)%>%
过滤器(通量.Med==最大(通量.Med))%>%
选择(通量.Med)%>%
dplyr::重命名(ROI1_max=Flux.Med)%>%
as.data.frame(ROI1.max)
投资回报率2.2%
分组依据(ID)%>%
过滤器(ROI.No==“ROI 2”&帧号==最小值(帧号))%>%
选择(通量.Med)%>%
dplyr::重命名(ROI2_基线=通量.Med)%>%
as.data.frame(ROI2.基线)
ROI2.max%
分组依据(ID)%>%
过滤器(ROI.No==“ROI 2”)%>%
过滤器(通量.Med==最大(通量.Med))%>%
选择(通量.Med)%>%
dplyr::重命名(ROI2_max=Flux.Med)%>%
as.data.frame(ROI2.max)

谢谢。最后我用了更长的方法,虽然事后看来我可以用你的dplyr方法,然后再过滤/排序。谢谢。最后,我用了更长的方法,尽管事后看来,我本可以使用您的dplyr方法,然后进行过滤/排序。