Управление кадром данных (с помощью R) - PullRequest
0 голосов
/ 28 мая 2018

У меня трудная цель, чтобы облегчить мой анализ;Насколько мне известно, нет подобных вопросов.У меня очень длинный фрейм данных в Excel, который я воспроизвожу здесь - в более простой форме - в среде R:

A1 <- cbind("sp1","sp2","sp3", "sp4", "sp7", "sp8") 
A2 <- cbind("sp1","sp3", "sp4", "sp7", "sp9") 
A3 <- cbind("sp5","sp6","sp7", "sp10") 
A4 <- cbind("sp1","sp2","sp7", "sp9", "sp10") 
A5 <- cbind("sp3","sp4") 

max_row <- 6

A1 <- c(A1, rep(NA, max_row - length(A1)))
A2 <- c(A2, rep(NA, max_row - length(A2))) 
A3 <- c(A3, rep(NA, max_row - length(A3))) 
A4 <- c(A4, rep(NA, max_row - length(A4))) 
A5 <- c(A5, rep(NA, max_row - length(A5))) 
df <-cbind(A1,A2, A3, A4, A5)
df <- as.data.frame(df)
df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)

Чтобы лучше понять контекст, в котором я работаю, 'sp' - это виды, а A* это места, где я обнаружил данный вид.

Я хочу преобразовать этот фрейм данных в другой, структурированный следующим образом:

The dataframe I want to obtain in an automated way

Первый столбец содержитназвания сайтов, а следующие являются названиями видов (очевидно, повторяются только один раз).Затем мне нужно присвоить «1» для присутствия и «0» для отсутствия на данном сайте.

Я потратил много часов, чтобы попытаться достичь своей цели, но это слишком сложная проблемадля моих возможностей синтаксиса R.

Кто-нибудь может любезно помочь мне?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы можете использовать gather и spread из tidyverse:

library(tidyverse)

df %>%
  gather(A, sp) %>%
  filter(!is.na(sp)) %>%
  group_by(A, sp) %>%
  count() %>%
  spread(sp, n) %>%
  replace(., is.na(.), 0)

  # A tibble: 5 x 11
# Groups:   A [5]
  A       sp1  sp10   sp2   sp3   sp4   sp5   sp6   sp7   sp8   sp9
* <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A1       1.    0.    1.    1.    1.    0.    0.    1.    1.    0.
2 A2       1.    0.    0.    1.    1.    0.    0.    1.    0.    1.
3 A3       0.    1.    0.    0.    0.    1.    1.    1.    0.    0.
4 A4       1.    1.    1.    0.    0.    0.    0.    1.    0.    1.
5 A5       0.    0.    0.    1.    1.    0.    0.    0.    0.    0.
0 голосов
/ 28 мая 2018

Вы можете собрать ваши данные в длинном формате для обработки и добавить столбец, показывающий наличие видов на сайте.Затем используйте reshape2::dcast для распространения данных в широком формате как:

library(tidyverse)
library(reshape2)

df %>% gather(Site, Species) %>%
  filter(!is.na(Species)) %>%
  mutate(value = 1) %>%      #Species are present on a site
  dcast(Site~Species, value.var = "value", fill = 0)

#   Site sp1 sp10 sp2 sp3 sp4 sp5 sp6 sp7 sp8 sp9
# 1   A1   1    0   1   1   1   0   0   1   1   0
# 2   A2   1    0   0   1   1   0   0   1   0   1
# 3   A3   0    1   0   0   0   1   1   1   0   0
# 4   A4   1    1   1   0   0   0   0   1   0   1
# 5   A5   0    0   0   1   1   0   0   0   0   0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...