#r #dataframe #for-loop #left-join
#r #фрейм данных #for-цикл #левое соединение
Вопрос:
У меня есть несколько фреймов данных с множеством специфических функций (идентификатор OTU). В качестве примера, table1:
A tibble: 6 x 46
`OTU ID` V1.1.K1 V1.1.K2 V1.1.K3 V1.1.N1 V1.1.N2 V1.14.K16 V1.14.K17 V1.14.K18 V1.14.N0 V1.14.W16 V1.14.W17
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 107273e~ 2239 2861 1404 10255 585 4448 8340 5027 934 241 4983
2 bf83e8b~ 174 95 406 4054 408 23383 6820 31184 2046 411 645
3 b744eae~ 49 35 126 3440 245 83 443 18 11205 121 388
4 0e40fa4~ 86 38 165 1015 111 10022 9973 228 90 638 2671
5 33ee4bb~ 50 50 53 68 34 665 278 4816 218 38 136
6 c1c17b3~ 2366 7838 7827 471 60 160 27 37 190 12 303
# ... with 34 more variables: V1.14.W18 <dbl>, V1.2.K4 <dbl>, V1.2.K5 <dbl>, V1.2.K6 <dbl>, V1.2.W4 <dbl>,
# V1.2.W5 <dbl>, V1.2.W6 <dbl>, V1.21.K19 <dbl>, V1.21.K20 <dbl>, V1.21.K21 <dbl>, V1.21.N0 <dbl>,
# V1.21.W19 <dbl>, V1.21.W20 <dbl>, V1.21.W21 <dbl>, V1.3.K7 <dbl>, V1.3.K8 <dbl>, V1.3.K9 <dbl>,
# V1.3.W7 <dbl>, V1.3.W8 <dbl>, V1.3.W9 <dbl>, V1.4.K10 <dbl>, V1.4.K11 <dbl>, V1.4.K12 <dbl>, V1.4.W10 <dbl>,
# V1.4.W11 <dbl>, V1.4.W12 <dbl>, V1.7.K13 <dbl>, V1.7.K14 <dbl>, V1.7.K15 <dbl>, V1.7.N0 <dbl>,
# V1.7.W13 <dbl>, V1.7.W14 <dbl>, V1.7.W15 <dbl>, sum <dbl>
Другие таблицы выглядят сопоставимо, они имеют только разное количество. Тогда у меня есть таксономия-фрейм данных, который содержит информацию о функциях (идентификатор OTU). Это называется таксономией и выглядит так:
`OTU ID` Taxon Confidence
<chr> <chr> <dbl>
1 00009522ba8d1badfe92207~ d__Bacteria; p__Desulfobacterota; c__Desulfovibrionia; o__Desulfovibrional~ 0.966
2 0000fb10633e8ad10a0f0b7~ d__Bacteria; p__Actinobacteriota; c__Actinobacteria; o__Micrococcales; f__~ 0.999
3 0001d123420b59585627edf~ d__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rhizobiales; f_~ 1.00
4 0001f7b8d2a9d04fbd0df3e~ d__Bacteria; p__Bacteroidota; c__Bacteroidia; o__Cytophagales; f__Bernarde~ 1.00
5 00026915bdc887a8587e62e~ d__Bacteria; p__Planctomycetota; c__Pla4_lineage; o__Pla4_lineage; f__Pla4~ 0.997
6 0004a49903f29d739411b1c~ d__Archaea; p__Nanoarchaeota; c__Nanoarchaeia; o__Woesearchaeales; f__GW20~ 0.777
Таблицы изобилия должны быть объединены с таблицей таксономии из-за столбца идентификатора OTU.
Для одного фрейма данных он работает со следующим кодом:
table1_tax <- left_join(table1, taxonomy, by = "OTU ID")
Теперь я хочу включить команду в цикл for, чтобы перебрать все мои таблицы изобилия,
каждая из которых должна быть объединена с файлом таксономии и присвоена новой переменной, с которой я могу работать.
Я не силен в циклах for, поэтому извините за мои ошибки.
#' get the tables in a list
tables <- mget(ls()[1:9])
#' as left_join can not loop over a list, I just extracted the names of the abundance tables in the variable. Was this step correct?
tables <- names(tables)
#' For Loop
for(i in 1:length(tables)) {
assign(paste0("tax_", tables[i]), left_join(tables[i], taxonomy, by= setnames("OTU ID")))
}
Ошибка, которую я получаю, тогда:
Error in UseMethod("left_join") :
no applicable method for 'left_join' applied to an object of class "character"
Как я могу решить эту проблему? У вас есть какие-либо идеи?
Спасибо 🙂
Kathrin
Комментарии:
1.
tables
это вектор символов, а не список. Попробуйте сtables <- as.list(tables)
помощью .2. Затем я получаю сообщение об ошибке: Ошибка в UseMethod («left_join»): нет применимого метода для ‘left_join’, применяемого к объекту класса «list»
Ответ №1:
Следующее дает вам то, что вы хотите?
library(tidyverse)
# fake tables
df1 <- tribble(
~OTUID, ~V1, ~V2, ~V3, ~V4,
"09522ba", 2239, 2861, 1404, 10255,
"0fb1063", 174, 95, 406, 4054,
"b744eae", 49, 35, 126, 3440
)
df2 <- df3 <- df4 <- df1
# named list of tables
lst_tables <- list(df1 = df1, df2 = df2, df3 = df3, df4 = df4)
# fake taxonomy
taxo <-
tribble(
~OTUID, ~Taxon, ~Confidence,
"09522ba", "d__Bacteria p__Desulfobacterota c__Desulfovibrionia", 0.966,
"0fb1063", "d__Bacteria p__Actinobacteriota c__Actinobacteria", 0.999,
"1d12342", "d__Bacteria p__Proteobacteria c__Alphaproteobacteria", 1.00,
)
# 1) if you really want the loop
outbis <- list()
for(i in seq_along(lst_tables)) {
outbis[[i]] <- left_join(lst_tables[[i]], taxo, by = "OTUID")
names(outbis)[i] <- paste0("tax_", names(lst_tables)[i])
}
# 2) without the loop
out <-
map(lst_tables, ~ left_join(.x, taxo))
Комментарии:
1. Отлично, это сработало 🙂 Оба решения, но, как вы только что указали, map()-Fct намного проще!