簡體   English   中英

折疊一個數據幀列表並與 R 中的另一個數據幀列表組合

[英]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 年了,如果我知道一件事,那就是人們經常避免像瘟疫這樣的循環。 我知道applylapply等的一些變化可能會讓生活變得輕松。 盡管如此,在查閱了 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 datareports中的每個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 的解決方案,但使用了subsetsetNames和不同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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM