[英]Collapsing one list of dataframes and combining with another list of dataframes in R
長期潛伏在論壇上,這將是我的第一篇文章。 提前感謝您的耐心等待,我在計算機科學方面的正規培訓有限,而且白天絕對是一名生物學家。
我的問題是關於如何處理在 R 中具有多個數據幀的兩個列表。 請在下面找到示例數據。
set.seed(1)
set1 <- data.frame(NAME = paste("row_", 1:10, sep = ""),
SYMBOL = paste(c(sample(LETTERS, 10))),
SIGNIFICANT = sample(c("yes", "no"), 10, replace = TRUE))
set2 <- data.frame(NAME = paste("row_", 1:10, sep = ""),
SYMBOL = paste(c(sample(LETTERS, 10))),
SIGNIFICANT = sample(c("yes", "no"), 10, replace = TRUE))
set3 <- data.frame(NAME = paste("row_", 1:10, sep = ""),
SYMBOL = paste(c(sample(LETTERS, 10))),
SIGNIFICANT = sample(c("yes", "no"), 10, replace = TRUE))
set4 <- data.frame(NAME = paste("row_", 1:10, sep = ""),
SYMBOL = paste(c(sample(LETTERS, 10))),
SIGNIFICANT = sample(c("yes", "no"), 10, replace = TRUE))
files <- list(set1, set2, set3, set4)
names(files) <- paste("Set", 1:4, sep = "")
reports <- list(data.frame(SETS = c("Set1", "Set3"),
STATISTIC = runif(2)),
data.frame(SETS = c("Set2", "Set4"),
STATISTIC = runif(2)))
names(reports) <- c("Report1", "Report2")
files
是一個列表,其中包含來自分析的許多元數據數據幀。
> files$Set1
NAME SYMBOL SIGNIFICANT
1 row_1 Y no
2 row_2 D no
3 row_3 G no
4 row_4 A yes
5 row_5 B yes
6 row_6 K yes
7 row_7 N yes
8 row_8 R yes
9 row_9 W yes
10 row_10 J yes
reports
也是一個包含 2 個數據框的列表,其中包含來自雙向分析和相關統計數據的主要輸出。
> reports$Report1
SETS STATISTIC
1 Set1 0.4100841
2 Set3 0.8108702
請注意, files
列表中數據框的名稱對應於reports
列表中數據框的第 2 列。
我希望以特定方式折疊這些files
元數據。 如果files$Set1$SIGNIFICANT == 'yes'
,我想將 append 對應的SYMBOL
轉換為逗號分隔的字符串。 然后,我想將 append 的字符串到相應的 Set 內reports
。 因此,我想要的 output 如下:
> head(reports$Report1)
SETS STATISTIC SYMBOL
1 Set1 0.4100841 A, V, K, N, R, W, J
2 Set3 0.8108702 F, S, J, V
Report2
也是如此
對於此示例,手動操作很容易,但在我的實際項目中, length(files)=600
我試圖通過for
循環解析它,但一直遇到錯誤。 這是我當前的迭代
output <- data.frame()
for(i in 1:length(files)){
for(j in 1:nrow(files[[i]])){
if(files[j, 3] == "Yes"){
output[i, 1]=i;
output[i, 2]=paste0(i[,2], collapse = ", ")
}
}
}
而我目前的錯誤:
Error in i[[j, 3]] : incorrect number of subscripts
我已經使用 R 大約 4 年了,如果我知道一件事,那就是人們經常避免像瘟疫這樣的循環。 我知道apply
、 lapply
等的一些變化可能會讓生活變得輕松。 盡管如此,在查閱了 R 文獻和這個論壇之后,我被難住了。
希望對此提供一些建議。 謝謝大家!
我認為您可以分兩步執行此操作,首先創建一個 data.frame,其中包含每個集合的重要符號。 這里
sigset <- stack(lapply(files, function(x) paste(x$SYMBOL[x$SIGNIFICANT=="yes"], collapse=", ")))
names(sigset) <- c("SYMBOL","SETS")
我們使用lapply()
來迭代文件列表,提取重要符號可以將它們組合在一起,然后我們將列表堆疊到 data.frame 中以使其更易於使用。 我們更改名稱,以便它可以更輕松地合並列名。 然后我們可以將此列表與每個報告合並
output <- lapply(reports, function(x) merge(x, sigset))
您可以使用sapply
遍歷每個 dataframe 中的files
列表,僅保留SIGNIFICANT = 'yes'
值並將它們折疊成一個字符串。
data <- stack(sapply(files,function(x) toString(x$SYMBOL[x$SIGNIFICANT=='yes'])))
data
# values ind
#1 A, B, K, N, R, W, J Set1
#2 B, F Set2
#3 F, S, J, V Set3
#4 W, Z, H, Q, D, M Set4
然后,您可以merge
data
與reports
中的每個dataframe
合並。
result <- lapply(reports, function(x) merge(x,data, by.x = 'SETS', by.y = 'ind'))
result
#$Report1
# SETS STATISTIC values
#1 Set1 0.4100841 A, B, K, N, R, W, J
#2 Set3 0.8108702 F, S, J, V
#$Report2
# SETS STATISTIC values
#1 Set2 0.6049333 B, F
#2 Set4 0.6547239 W, Z, H, Q, D, M
這是類似於 MrFlick 的解決方案,但使用了subset
、 setNames
和不同lapply
調用,這些調用可能更容易閱讀:
# get the characters with SIGNIFICANT equal to "yes"
all_symbs <- lapply(files, subset, SIGNIFICANT == "yes", SYMBOL, TRUE)
# create one data.frame with the above after concatenating
all_files <- setNames(stack(lapply(all_symbs, paste0, collapse = ", ")),
c("SYMBOL","SETS"))
# merge with reports
res <- lapply(reports, merge, y = all_files)
# the result
res
#R> $Report1
#R> SETS STATISTIC SYMBOL
#R> 1 Set1 0.4100841 A, B, K, N, R, W, J
#R> 2 Set3 0.8108702 F, S, J, V
#R>
#R> $Report2
#R> SETS STATISTIC SYMBOL
#R> 1 Set2 0.6049333 B, F
#R> 2 Set4 0.6547239 W, Z, H, Q, D, M
您可以通過創建匿名 function 而不是兩個lapply(files, ...)
和lapply(all_symbs, ...)
調用來擺脫其中一個lapply
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.