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方法,然后进行过滤/排序。