r-用于循环,将一个大数据帧(30列)划分为几个较小的数据帧(3列)



第一次在这里写问题,所以请不要太苛刻。我有一个名为merged的大数据帧;时间";列;嗯"列和28列,其中每列存储来自称为合并的板(所以28个板(df的测量的数据。现在我想创建一个";对于循环";其创建具有列"的新dfs;时间"嗯"以及从板1或柱3开始直到最后一个板(28或柱30(的板的测量。问题是,我不知道如何在循环中调整新df的名称,使其只使用1个板的信息创建28个不同的新df,而不是只覆盖新df并只存储最后一个板的数据。初学者循环功能。如果你需要更多信息,请随时询问,我会尽力提供信息。

提前感谢大家!

收到

下面是一个精心制作的例子。我首先创建一个与您的数据相似的data.frame。然后,我使用tidyr包将宽格式转换为长格式。(还有其他方法(。

使用长格式,可以很容易地通过Plate标识符选择出您想要的数据。

#----------------------
# Cook up a data.frame
#----------------------
# 30 sequential dates
dates = seq.Date(as.Date("2022-03-01"), as.Date("2022-03-30"), 1)
# 50 wells 
wells <- lapply(LETTERS[1:5], function(l) {paste0(l, seq(1, 10))})
wells <- unlist(wells)
# Create a data.frame
wells_data <- data.frame(expand.grid(dates, wells))
names(wells_data) <- c("Dates", "Wells")
# 30 columns of artificial data
for (i in 1:30) {
new_data <- data.frame(runif(1:nrow(wells_data)))
names(new_data) <- paste0("Plate", i)
wells_data <- cbind(wells_data, new_data)
}
head(wells_data)
Dates Wells     Plate1    Plate2    Plate3     Plate4     Plate5
1 2022-03-01    A1 0.20418463 0.5932133 0.7070428 0.04231371 0.25872767
2 2022-03-02    A1 0.95218240 0.1114270 0.3763757 0.22992064 0.05632674
3 2022-03-03    A1 0.07162576 0.9902931 0.1437405 0.40102327 0.56432590
4 2022-03-04    A1 0.17148644 0.1849485 0.2062618 0.45908182 0.44657831
5 2022-03-05    A1 0.11334931 0.4820294 0.1663636 0.87436576 0.60177308
6 2022-03-06    A1 0.13949741 0.7862085 0.6162253 0.50698110 0.75309069
Plate6     Plate7      Plate8    Plate9    Plate10    Plate11   Plate12
1 0.77206623 0.45816279 0.002027475 0.3821823 0.30170925 0.08730046 0.7638708
2 0.31140577 0.39479768 0.919386005 0.2369556 0.33105790 0.86560846 0.9464049
3 0.36804632 0.30644346 0.782938605 0.3723977 0.21561693 0.14770805 0.7371391
4 0.07265802 0.68454399 0.916244462 0.7688442 0.36590464 0.42293563 0.8448824
5 0.59587190 0.78073586 0.338200076 0.3895508 0.61586528 0.47494553 0.8315232
6 0.41189998 0.06666752 0.721342234 0.5130501 0.06648771 0.61675408 0.9384815
# ...more columns...
#----------------------
# Now convert from wide to long
# and split by plate identifier
#----------------------
library(tidyr)
wells_data <- pivot_longer(wells_data,
cols=(3:ncol(wells_data)),
names_to="Plate",
values_to="measurement")
head(wells_data)
# A tibble: 6 × 4
Dates      Wells Plate  measurement
<date>     <fct> <chr>        <dbl>
1 2022-03-01 A1    Plate1      0.204 
2 2022-03-01 A1    Plate2      0.593 
3 2022-03-01 A1    Plate3      0.707 
4 2022-03-01 A1    Plate4      0.0423
5 2022-03-01 A1    Plate5      0.259 
6 2022-03-01 A1    Plate6      0.772 
# Now it's easy to select out each Plate:
plates = unique(wells_data$Plate)
lapply(plates, function(p) {
subset = wells_data[wells_data$Plate == p,]
# Do whatever you want with this subset
print(paste("Mean for Plate", p, ":",
mean(subset$measurement)))

})

希望这能帮助你继续前进。

避免用许多结构相似、独立的数据帧淹没全局环境。考虑使用lapplysapply(用于名称(构建许多相关元素的单个列表,以构建子集数据帧列表。如下所示,如果保存在更大的列表中,则不会丢失data.frame的功能:

# RETRIEVE ALL V-STARTING COLUMN NAMES
v_cols <- colnames(merged_df)[grep("^V", colnames(merged_df))]
# NAMED LIST OF PLATE SUBSETTED DATA FRAMES
plate_measurements_list <- sapply(
v_cols, 
function(i) merged_df[,c("Time", "Well", col)],
simplify = FALSE
)

# ACCESS AND USE EACH DATA FRAME
head(plate_measurements_list$V1)
tail(plate_measurements_list$V2)
summary(plate_measurements_list$V3)
...
str(plate_measurements_list$V28)

最新更新