R- Как мне сделать функцию al oop для извлечения данных и вставки в новый фрейм данных - PullRequest
1 голос
/ 09 апреля 2020

У меня есть фрейм данных, состоящий из двух столбцов («Cam_Trap_Days» и «Genus»), где Cam_Trap_Days указывает конкретный день и род, которые присутствовали в наблюдении.

structure(list(Cam_Trap_Days = c(0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 
3, 3, 3, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 23, 24, 25, 
25, 25, 26, 26, 28, 29, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 
37, 38, 38, 39, 39, 40, 41, 42, 42, 43, 44, 44, 44, 45, 45, 45, 
46, 46, 46, 46, 47, 49, 50, 51, 52, 596, 596, 597, 597, 598, 
598, 598, 599, 599, 599, 599, 599, 600, 601, 601, 601, 602, 602, 
602, 604, 605, 605, 605, 606, 606, 627, 627, 633, 633, 634, 634
), Genus = structure(c(9L, 8L, 6L, 8L, 2L, 6L, 11L, 12L, 4L, 
8L, 6L, 11L, 8L, 6L, 6L, 6L, 2L, 6L, 3L, 6L, 6L, 6L, 8L, 3L, 
6L, 12L, 3L, 6L, 6L, 8L, 6L, 6L, 7L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 11L, 6L, 12L, 6L, 3L, 6L, 8L, 6L, 6L, 12L, 6L, 3L, 6L, 11L, 
12L, 11L, 12L, 6L, 11L, 6L, 7L, 12L, 11L, 6L, 12L, 6L, 6L, 9L, 
8L, 8L, 9L, 9L, 8L, 12L, 12L, 8L, 10L, 11L, 2L, 8L, 8L, 10L, 
11L, 7L, 8L, 9L, 8L, 9L, 8L, 10L, 8L, 9L, 10L, 2L, 5L, 2L, 2L, 
10L), .Label = c("", "Apodemus", "Columba", "Fringilla", "Homo", 
"Meles", "Muntiacus", "Oryctolagus", "Phasianus", "Sciurus", 
"Turdus", "Vulpes"), class = "factor")), row.names = c(NA, 98L
), class = "data.frame")

Моя цель - создать функцию, которая проходит через этот фрейм данных, чтобы извлечь присутствие каждого рода в каждый день захвата камеры и вставить как присутствие (то есть 1) в новый фрейм данных, который имеет следующий формат (количество строк для CamDays) 635):

  CamDays Phasianus Oryctolagus Meles Apodemus Turdus Vulpes Fringilla Columba Muntiacus Sciurus Homo
1        0         0           0     0        0      0      0         0       0         0       0    0
2        1         0           0     0        0      0      0         0       0         0       0    0
3        2         0           0     0        0      0      0         0       0         0       0    0

Я бы хотел, чтобы в новом фрейме данных каждый род имел значение 1, если он присутствует в конкретном Cam_Trap_Days, а остальные роды остались равными 0. Пример ниже Вот как бы я хотел, чтобы это выглядело (если бы на CamDay 0 присутствовали только Phasianus и Oryctolagus).

  CamDays Phasianus Oryctolagus Meles Apodemus Turdus Vulpes Fringilla Columba Muntiacus Sciurus Homo
1        0         1           1     0        0      0      0         0       0         0       0    0

Заранее спасибо за вашу помощь !!

1 Ответ

1 голос
/ 09 апреля 2020

Вот код в базе R, который выполняет вашу задачу:

extractdata <- lapply(unique(df$Cam_Trap_Days), function(X) lapply(unique(df$Genus), function(Y)  length(which(df$Genus== Y & df$Cam_Trap_Days == X))))
df_new <- matrix(unlist(extractdata),nrow = length(extractdata),byrow = T)
row.names(df_new) <- unique(df$Cam_Trap_Days)
colnames(df_new) <- unique(df$Genus)

Редактировать: Вот немного другой код, который пропускает шаг, но приводит к тому же выводу.

df_new <- t(sapply(unique(df$Cam_Trap_Days), function(X) lapply(unique(df$Genus), function(Y)  length(which(df$Genus== Y & df$Cam_Trap_Days == X)))))
row.names(df_new) <- unique(df$Cam_Trap_Days)
colnames(df_new) <- unique(df$Genus)

Выход:

> df_new
    Phasianus Oryctolagus Meles Apodemus Turdus Vulpes Fringilla Columba Muntiacus Sciurus Homo
0           1           1     0        0      0      0         0       0         0       0    0
1           0           1     1        1      0      0         0       0         0       0    0
2           0           1     1        0      1      1         1       0         0       0    0
3           0           1     1        0      1      0         0       0         0       0    0
17          0           0     1        0      0      0         0       0         0       0    0
18          0           0     1        0      0      0         0       0         0       0    0
19          0           0     1        1      0      0         0       0         0       0    0
20          0           0     1        0      0      0         0       0         0       0    0
21          0           0     1        0      0      0         0       1         0       0    0
22          0           0     1        0      0      0         0       0         0       0    0
23          0           1     1        0      0      0         0       1         0       0    0
24          0           0     1        0      0      0         0       0         0       0    0
25          0           0     1        0      0      1         0       1         0       0    0
26          0           1     1        0      0      0         0       0         0       0    0
28          0           0     1        0      0      0         0       0         0       0    0
29          0           0     1        0      0      0         0       0         1       0    0
30          0           0     1        0      0      0         0       0         0       0    0
31          0           0     1        0      0      0         0       0         0       0    0
32          0           0     1        0      0      0         0       0         0       0    0
33          0           0     1        0      0      0         0       0         0       0    0
34          0           0     1        0      0      0         0       0         0       0    0
35          0           0     1        0      0      0         0       0         0       0    0
36          0           0     1        0      1      0         0       0         0       0    0
37          0           0     1        0      0      1         0       0         0       0    0
38          0           0     1        0      0      0         0       1         0       0    0
39          0           1     1        0      0      0         0       0         0       0    0
40          0           0     1        0      0      0         0       0         0       0    0
41          0           0     1        0      0      0         0       0         0       0    0
42          0           0     1        0      0      1         0       0         0       0    0
43          0           0     0        0      0      0         0       1         0       0    0
44          0           0     1        0      1      1         0       0         0       0    0
45          0           0     1        0      1      1         0       0         0       0    0
46          0           0     1        0      1      1         0       0         1       0    0
47          0           0     0        0      1      0         0       0         0       0    0
49          0           0     1        0      0      0         0       0         0       0    0
50          0           0     0        0      0      1         0       0         0       0    0
51          0           0     1        0      0      0         0       0         0       0    0
52          0           0     1        0      0      0         0       0         0       0    0
596         1           1     0        0      0      0         0       0         0       0    0
597         1           1     0        0      0      0         0       0         0       0    0
598         1           1     0        0      0      1         0       0         0       0    0
599         0           1     0        1      1      1         0       0         0       1    0
600         0           1     0        0      0      0         0       0         0       0    0
601         0           1     0        0      1      0         0       0         0       1    0
602         1           1     0        0      0      0         0       0         1       0    0
604         0           1     0        0      0      0         0       0         0       0    0
605         1           1     0        0      0      0         0       0         0       1    0
606         1           1     0        0      0      0         0       0         0       0    0
627         0           0     0        1      0      0         0       0         0       1    0
633         0           0     0        1      0      0         0       0         0       0    1
634         0           0     0        1      0      0         0       0         0       1    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...